장고 형식
HTML 양식은 웹사이트 상호작용의 고전적인 방법입니다. 이 장에서는 Django를 사용하여 사용자가 제출한 양식 데이터를 처리하는 방법을 소개합니다.
HTTP 요청
HTTP 프로토콜은 "요청-응답" 방식으로 작동합니다. 클라이언트가 요청을 보낼 때 요청에 데이터를 추가할 수 있습니다. 서버는 요청을 분석하여 클라이언트가 보낸 데이터를 얻고 URL을 기반으로 특정 서비스를 제공할 수 있습니다.
GET 메소드
사용자 요청을 받기 위해 이전 프로젝트에서 search.py 파일을 생성했습니다.
# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render_to_response # 表单 def search_form(request): return render_to_response('search_form.html') # 接收请求数据 def search(request): request.encoding='utf-8' if 'q' in request.GET: message = '你搜索的内容为: ' + request.GET['q'].encode('utf-8') else: message = '你提交了空表单' return HttpResponse(message)
템플릿 디렉터리 템플릿에 search_form.html 양식을 추가합니다.
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>
urls.py 규칙은 다음과 같이 수정됩니다. Form:
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), )
접속 주소: http://192.168.45.3:8000/search-form/ 검색 결과는 다음과 같습니다.
POST 방식
위에서는 GET 방식을 사용했습니다. . 보기 표시와 요청 처리는 두 가지 기능으로 구분됩니다.
POST 방법은 데이터를 제출할 때 더 일반적으로 사용됩니다. 아래에서는 이 방법을 사용하며 URL과 처리 기능을 사용하여 뷰 표시와 요청 처리를 동시에 수행합니다.
tmplate에 post.html을 생성합니다:
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search-post/" method="post"> {% csrf_token %} <input type="text" name="q"> <input type="submit" value="Submit"> </form> <p>{{ rlt }}</p> </body> </html>
템플릿 끝에 rlt 표시를 추가하여 테이블 처리 결과를 위한 장소를 예약합니다.
양식 뒤에는 {% csrf_token %} 태그도 있습니다. csrf의 전체 이름은 Cross Site Request Forgery입니다. 이는 위장된 제출 요청을 방지하기 위해 Django에서 제공하는 기능입니다. POST 메소드를 사용하여 제출된 양식에는 이 태그가 있어야 합니다.
HelloWorld 디렉터리에 새 search2.py 파일을 만들고 search_post 함수를 사용하여 POST 요청을 처리합니다.
# -*- coding: utf-8 -*- from django.shortcuts import render from django.core.context_processors import csrf # 接收POST请求数据 def search_post(request): ctx ={} ctx.update(csrf(request)) if request.POST: ctx['rlt'] = request.POST['q'] return render(request, "post.html", ctx)
urls.py 규칙은 다음 형식으로 수정됩니다.
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search from HelloWorld import search2 urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), (r'^search-post/$', search2.search_post), )
http://192.168.45.3을 방문하세요. :8000/search-post/ 표시된 결과는 다음과 같습니다.
![1476944532940477.jpg 1046.jpg](https://img.php.cn/upload/image/268/970/282/1476944532940477.jpg)
위 예제를 완료한 후 디렉토리 구조는 다음과 같습니다.
HelloWorld |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- models.pyc | |-- search.py | |-- search.pyc | |-- search2.py | |-- search2.pyc | |-- settings.py | |-- settings.pyc | |-- testdb.py | |-- testdb.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- TestModel | |-- __init__.py | |-- __init__.pyc | |-- admin.py | |-- models.py | |-- models.pyc | |-- tests.py | `-- views.py |-- manage.py `-- templates |-- base.html |-- hello.html |-- post.html `-- search_form.html 3 directories, 29 files
Request 객체
각 보기 함수의 첫 번째 매개변수는 HttpRequest 객체입니다. 다음 hello() 함수:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
HttpRequest 개체에는 현재 요청 URL에 대한 일부 정보가 포함되어 있습니다.
Properties | Description |
path | 전체 도메인 이름을 제외한 요청된 페이지 경로(예: "/hello/") |
method | 요청에 사용된 HTTP 메서드의 문자열 표현입니다. 모두 대문자로 표현됩니다. 예: if request.method == 'GET': |
GET | 포함 사전과 같은 객체. QueryDict 문서를 참조하세요. |
포스트 | 모든 HTTP POST 매개변수를 포함하는 사전과 유사한 개체입니다. QueryDict 문서를 참조하세요. 서버가 빈 POST 요청을 수신할 수도 있습니다. 즉, 양식에서 HTTP POST 메서드를 통해 요청을 제출하지만 양식에 데이터가 없습니다. 따라서 HTTP POST 메소드 사용 여부를 결정하기 위해 if request.POST 문을 사용할 수 없습니다. 대신 if request.method == "POST"를 사용하십시오(이 표의 메소드 속성 참조). 참고: POST에는 파일 업로드 정보가 포함되지 않습니다. FILES 속성을 참조하세요. |
REQUEST | 이 속성은 편의상 POST 및 GET 속성의 모음이지만 특별한 특성을 가지고 있습니다. POST 속성을 먼저 찾은 다음 GET 속성을 찾으세요. PHP의 $_REQUEST에서 배워보세요. 예를 들어 GET = {"name": "john"} 및 POST = {"age": '34'}인 경우 REQUEST["name"] 값은 "john", REQUEST["age"입니다. ] 값은 "34"입니다. GET 및 POST를 사용하는 것이 좋습니다. 두 속성이 더 명확하고 작성된 코드를 이해하기 쉽기 때문입니다. |
COOKIES | 모든 쿠키를 포함하는 표준 Python 사전 개체입니다. 키와 값은 모두 문자열입니다. 쿠키에 대한 자세한 설명은 12장을 참조하세요. |
FILES | 업로드된 모든 파일을 포함하는 사전과 유사한 개체입니다. FILES의 각 키는 <input type="file" name="" /> 태그의 name 속성 값입니다. FILES의 각 값은 다음 세 가지 키를 포함하는 표준 Python 사전 객체이기도 합니다.
|
사용 가능한 모든 HTTP 헤더 정보가 포함된 사전입니다. 예: |
|
는 django.contrib입니다. 현재 로그인된 사용자를 나타내는 auth.models.User 객체. | 액세스하는 사용자가 현재 로그인되어 있지 않은 경우 사용자는 django.contrib.auth.models.AnonymousUser의 인스턴스로 초기화됩니다. 사용자의 is_authenticated() 메소드를 통해 사용자가 로그인했는지 여부를 확인할 수 있습니다: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. 이 속성은 Django의 AuthenticationMiddleware가 활성화된 경우에만 사용할 수 있습니다. |
session | 읽을 수 있는 유일한 항목 Writable 속성은 현재 세션을 나타내는 사전 객체입니다. 이 속성은 Django의 세션 지원이 활성화된 경우에만 사용할 수 있습니다. 12장을 참조하세요. |
raw_post_data | 원시 HTTP POST 데이터, 구문 분석되지 않음. 고급 처리에 유용합니다. |
Request 객체에는 몇 가지 유용한 메소드도 있습니다:
메소드 | 설명 |
---|
方法 | 描述 |
---|---|
__getitem__(key) | 返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。 这是我们可以使用字典语法访问HttpRequest对象。 例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。 |
has_key() | 检查request.GET or request.POST中是否包含参数指定的Key。 |
get_full_path() | 返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true" |
is_secure() | 如果请求是安全的,返回True,就是说,发出的是HTTPS请求。 |
이것은 사전 구문을 사용하여 HttpRequest 객체에 액세스하는 방법입니다.
예를 들어 request["foo"]는 request.POST["foo"]와 request.GET["foo"]와 동일합니다.方法 | 描述 |
---|---|
__getitem__ | 和标准字典的处理有一点不同,就是,如果Key对应多个Value,__getitem__()返回最后一个value。 |
__setitem__ | 设置参数指定key的value列表(一个Python list)。注意:它只能在一个mutable QueryDict 对象上被调用(就是通过copy()产生的一个QueryDict对象的拷贝). |
get() | 如果key对应多个value,get()返回最后一个value。 |
update() | 参数可以是QueryDict,也可以是标准字典。和标准字典的update方法不同,该方法添加字典 items,而不是替换它们: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2'] |
items() | 和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__(): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
values() | 和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__(): |
메소드 | 설명 / Strong> | 🎜🎜🎜🎜__getitem__🎜🎜🎜🎜은 표준 사전 처리와 약간 다릅니다. 즉, Key가 여러 값에 해당하는 경우 __getitem__()은 마지막 값을 반환합니다. 🎜🎜🎜🎜🎜🎜__setitem__🎜🎜🎜🎜키의 값 목록(Python 목록)을 지정하도록 매개변수를 설정합니다. 참고: 변경 가능한 QueryDict 개체(즉, copy()에 의해 생성된 QueryDict 개체의 복사본)에서만 호출할 수 있습니다. 🎜🎜🎜🎜🎜🎜get()🎜🎜🎜🎜키가 여러 값에 해당하는 경우 get()은 마지막 값을 반환합니다. 🎜🎜🎜🎜🎜🎜update()🎜🎜🎜🎜매개변수는 QueryDict 또는 표준 사전일 수 있습니다. 표준 사전의 업데이트 방법과 달리 이 방법은 사전 항목을 교체하는 대신 추가합니다. 🎜
---|
메서드 th> | 설명 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 🎜객체의 복사본을 반환합니다. Python 표준 라이브러리()의 copy.deepcopy입니다. 복사본은 변경 가능합니다. 즉, 복사본의 값이 변경될 수 있습니다. 🎜 | ||||||||||||||||
🎜getlist(key)🎜 | 🎜매개변수 키에 해당하는 모든 값을 Python 목록으로 반환합니다. 키가 존재하지 않으면 빈 목록이 반환됩니다. 일종의 목록 반환이 보장됩니다.🎜 | ||||||||||||||||
🎜setlist(key,list_)🎜 | 🎜key 값을 list_( __setitem__())과는 다릅니다.🎜 | ||||||||||||||||
🎜appendlist(key, item)🎜 | 🎜키와 연결된 내부 목록에 항목을 추가합니다.🎜 td > | ||||||||||||||||
🎜setlistdefault(key,list)🎜 | 🎜단일 값 대신 목록을 매개변수로 허용한다는 점에서 setdefault와 약간 다릅니다. 🎜 | ||||||||||||||||
🎜lists()🎜 | 🎜는 items()와 약간 다르며, 키의 모든 값을 목록, 예: 🎜rrreee | ||||||||||||||||
🎜urlencode()🎜 | 🎜 쿼리 문자열 형식으로 형식화된 문자열을 반환합니다(예: "a=2&b = 3&b=5").🎜 |