장고 형식


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/ 검색 결과는 다음과 같습니다.

1044.jpg

1045.jpg

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/ 표시된 결과는 다음과 같습니다.

1046.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에 대한 일부 정보가 포함되어 있습니다.

META 사용 가능한 모든 HTTP 헤더 정보가 포함된 사전입니다. 예: user는 django.contrib입니다. 현재 로그인된 사용자를 나타내는 auth.models.User 객체.

Properties

Description

path

전체 도메인 이름을 제외한 요청된 페이지 경로(예: "/hello/")

method

요청에 사용된 HTTP 메서드의 문자열 표현입니다. 모두 대문자로 표현됩니다. 예:

if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()

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 사전 객체이기도 합니다.

    filename: Python 문자열로 표시되는 업로드된 파일의 이름
  • content-type: 업로드된 파일의 콘텐츠 유형
  • content: 업로드된 파일의 원본 콘텐츠
  • 참고: 요청 방법이 POST이고 FILES에는 요청 페이지의 <form>에 enctype="multipart/form-data" 속성이 있는 경우에만 데이터가 있습니다. 그렇지 않으면 FILES는 빈 사전입니다.

    CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: 구문 분석되지 않은 원시 쿼리 문자열
  • REMOTE_ADDR: 클라이언트 IP 주소
  • REMO _HOST: 클라이언트 호스트 이름
  • SERVER_NAME: 서버 호스트 이름
  • SERVER_PORT: 서버 포트
  • META 이 헤더에는 키로 HTTP_가 접두사로 붙습니다. 예:

    HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: 클라이언트 호스트 헤더에서 보낸 HTTP information
  • HTTP_REFERER: 참조 페이지
  • HTTP_USER_AGENT: 클라이언트의 사용자-에이전트 문자열
  • HTTP_X_BENDER: X-Bender 헤더 정보

액세스하는 사용자가 현재 로그인되어 있지 않은 경우 사용자는 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请求。

__getitem__(key)

GET/POST의 키 값을 반환하고, 먼저 POST를 얻은 다음 GET을 얻습니다. 키가 존재하지 않으면 KeyError가 발생합니다.

이것은 사전 구문을 사용하여 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__():

🎜has_key()🎜🎜 request.GET 또는 request.POST에 매개변수에 지정된 키가 포함되어 있는지 확인하세요. 🎜🎜🎜🎜get_full_path()🎜🎜 쿼리 문자열이 포함된 요청 경로를 반환합니다. 예를 들어 "/music/bands/the_beatles/?print=true"🎜🎜🎜🎜is_secure()🎜🎜요청이 안전하면 True를 반환합니다. 즉, HTTPS 요청이 실행됩니다. 🎜🎜🎜🎜🎜QueryDict 객체 🎜🎜HttpRequest 객체에서 GET 및 POST 속성은 django.http.QueryDict 클래스의 인스턴스입니다. 🎜🎜QueryDict는 단일 키가 여러 값에 해당하는 상황을 처리하는 데 사용되는 사전과 유사한 사용자 정의 클래스입니다. 🎜🎜QueryDict는 모든 표준 사전 메소드를 구현합니다. 또한 몇 가지 고유한 메소드도 포함됩니다: 🎜🎜🎜🎜🎜__getitem__🎜🎜🎜🎜은 표준 사전 처리와 약간 다릅니다. 즉, Key가 여러 값에 해당하는 경우 __getitem__()은 마지막 값을 반환합니다. 🎜🎜🎜🎜🎜🎜__setitem__🎜🎜🎜🎜키의 값 목록(Python 목록)을 지정하도록 매개변수를 설정합니다. 참고: 변경 가능한 QueryDict 개체(즉, copy()에 의해 생성된 QueryDict 개체의 복사본)에서만 호출할 수 있습니다. 🎜🎜🎜🎜🎜🎜get()🎜🎜🎜🎜키가 여러 값에 해당하는 경우 get()은 마지막 값을 반환합니다. 🎜🎜🎜🎜🎜🎜update()🎜🎜🎜🎜매개변수는 QueryDict 또는 표준 사전일 수 있습니다. 표준 사전의 업데이트 방법과 달리 이 방법은 사전 항목을 교체하는 대신 추가합니다. 🎜
>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]
🎜🎜🎜🎜🎜items()🎜🎜🎜🎜은 단일 값 Logical을 사용하는 표준 사전의 items() 메서드와 약간 다릅니다. __getitem__():🎜rrreee🎜🎜🎜🎜🎜values()🎜🎜🎜🎜은 단일 값 논리 __getitem__():🎜🎜🎜🎜🎜을 사용하는 표준 사전의 value() 메서드와 약간 다릅니다.

또한 QueryDict에는 다음 표에 표시된 대로 몇 가지 메서드도 있습니다.

메소드설명
메서드설명
方法描述

copy()

返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) — 就是说,可以更改该拷贝的值。

getlist(key)

返回和参数key对应的所有值,作为一个Python list返回。如果key不存在,则返回空list。 It's guaranteed to return a list of some sort..

setlist(key,list_)

设置key的值为list_ (unlike __setitem__()).

appendlist(key,item)

添加item到和key关联的内部list.

setlistdefault(key,list)

和setdefault有一点不同,它接受list而不是单个value作为参数。

lists()

和items()有一点不同, 它会返回key的所有值,作为一个list, 例如:

rrreee

urlencode()

返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5").

copy()
🎜객체의 복사본을 반환합니다. Python 표준 라이브러리()의 copy.deepcopy입니다. 복사본은 변경 가능합니다. 즉, 복사본의 값이 변경될 수 있습니다. 🎜
🎜getlist(key)🎜🎜매개변수 키에 해당하는 모든 값을 Python 목록으로 반환합니다. 키가 존재하지 않으면 빈 목록이 반환됩니다. 일종의 목록 반환이 보장됩니다.🎜
🎜setlist(key,list_)🎜🎜key 값을 list_( __setitem__())과는 다릅니다.🎜
🎜appendlist(key, item)🎜🎜키와 연결된 내부 목록에 항목을 추가합니다.🎜
🎜setlistdefault(key,list)🎜🎜단일 값 대신 목록을 매개변수로 허용한다는 점에서 setdefault와 약간 다릅니다. 🎜
🎜lists()🎜🎜는 items()와 약간 다르며, 키의 모든 값을 목록, 예: 🎜rrreee
🎜urlencode()🎜🎜 쿼리 문자열 형식으로 형식화된 문자열을 반환합니다(예: "a=2&b = 3&b=5").🎜
🎜