Latest web development tutorials

장고 양식

HTML 양식은 고전적인 방법으로 대화 형 웹 사이트이다. 이 장에서는 사용자가 제출 장고 양식 데이터를 처리하는 방법에 대해 설명합니다.


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 규칙 개정 :

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 / 검색 폼 / 검색, 다음과 같이 결과는 다음과 같습니다 :

POST 방법

위의 우리는 메소드 GET을 사용했다. 이 치료에보기 표시 및 요청 처리 기능.

더 일반적으로 데이터를 전송하는 방법을 게시 할 수 있습니다. 또한 뷰를 도시하는 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는 크로스 사이트 요청 위조를 의미합니다. 이것은 위조 요청을 제출 방지 장고에 의해 제공됩니다. POST 메소드는이 레이블이 있어야합니다, 양식을 제출합니다.

을 HelloWorld 디렉토리의 새로운 파일 및 search2.py POST 요청을 처리 search_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/ 결과 표시는 다음과 같이 :

상기 예 종료 후, 우리의 디렉토리 구조 :

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

요청 개체

각 뷰 함수는 첫 번째 인수는 단지 안녕하세요 () 함수 아래 HttpRequest에 개체입니다 :

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

HttpRequest에 객체는 현재 요청 URL에 대한 몇 가지 정보를 포함합니다 :

재산

기술

통로

도메인 이름을 포함하지 않는 요청 된 페이지의 전체 경로 - 예를 들어, "/ 인사 /".

방법

요청 표현에 사용되는 문자열 HTTP 방법. 그것은 모든 대문자를 나타냅니다. 예를 들면 :

request.method가 == 'GET'의 경우 :
do_something ()
ELIF는 == 'POST'를 request.method :
do_something_else ()

GET

그것은 모든 HTTP GET 사전 같은 객체를 매개 변수가 포함되어 있습니다. QueryDict 설명서를 참조하십시오.

POST

그것은 모든 HTTP의 POST 매개 변수 사전과 같은 개체가 포함되어 있습니다. QueryDict 설명서를 참조하십시오.

서버가 빈받는 상황 POST 요청도 가능합니다. 즉, 폼의 형태는 HTTP POST 방법을 통해 요청을 제출하지만 데이터를 형성 할 수 없다. request.POST가 HTTP POST 방법을 사용할지 여부를 결정하는 경우, 따라서 문을 사용할 수 없으며 request.method == "POST"는 (표 방법 속성을 참조) 경우에 사용한다.

참고 : POST 파일 업로드 정보를 포함하지 않습니다. 파일 속성을 참조하십시오.

요청

편의를 위해,이 건물은 POST의 모음입니다 및 속성을 GET하지만, 특수성, POST 첫 번째 속성을 확인 한 후 속성을 가져가 본다. 참고 PHP의 $ _REQUEST.

및 POST = { "나이" '34'} : 당신이 = { "존", "이름"} GET 예를 들어, 다음 [가 "이름"] 값이 "존"이다 "나이"] REQUEST의 값이 용청 "34"

좀 더 명시 적으로이 두 속성은, 코드를 이해하기 쉽게 작성하기 때문에 강하게, GET 및 POST를 사용하는 것이 좋습니다.

쿠키

모든 쿠키는 표준 파이썬 사전 개체를 포함합니다. 키와 값은 문자열입니다. 제 12 장을 참조 쿠키에 대한 자세한 설명이 있습니다.

FILES

모든 업로드 된 파일을 포함하는 사전 같은 객체입니다. . 각 키 파일 중 <입력 유형 = "파일"이름 = ""/> 태그의 name 속성 값은 각각의 값은 또한 다음과 같은 세 개의 키를 포함하는 표준 파이썬 사전 개체입니다 파일 :

  • 파일 이름 : 파이썬의 문자열 표현에 파일 이름을 업로드
  • 업로드 된 파일의 내용 유형 : 내용 유형
  • 원본 콘텐츠 업로드 된 파일 : 내용

참고 : 요청 방법은 POST이고, 요청 페이지 <형태>에 enctype = "다중 / 폼 데이터"가 속성 FILES 만이 데이터입니다. 그렇지 않으면, 파일은 빈 사전이다.

META

가능한 모든 HTTP 헤더 사전을 포함. 예를 들면 :

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING : 해결되지 않은 원래의 쿼리 문자열
  • REMOTE_ADDR : 클라이언트의 IP 주소
  • REMOTE_HOST : 클라이언트 호스트 이름
  • 서버 이름 : 서버 호스트 이름
  • SERVER_PORT : 서버 포트

META 이러한 헤더는 예를 들어, HTTP_ 가장 중요한 접두사 :

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

사용자

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.

AuthenticationMiddleware이 속성을 사용할 때 장고에만 활성화

세션

사전 객체의 현재 세션을 나타내는 유일한 쓰기 가능한 속성입니다. 세션이 속성을 사용할 수 지원 때 장고에만 활성화. 제 12 장을 참조하십시오.

raw_post_data

원시 HTTP의 POST 데이터는 구문 분석되지. 치료를 진행 할 때 유용합니다.

Request 객체는 또한 몇 가지 유용한 방법이 있습니다 :

방법 기술
__getitem __ (키) 는 GET / POST 키를 돌려 첫 번째 GET을 촬영 한 후, POST를 취할. 키를 던져 KeyError를 존재하지 않습니다.
이것은 우리가 HttpRequest에 개체에 액세스 사전 구문을 사용할 수 있습니다 것입니다.
예를 들어, [ "foo는 것은"제 1 request.POST [ "foo에"] 다음 request.GET [ "foo는"동작에 해당 요청합니다.
것은 has_key () request.GET을 확인하거나 request.POST 매개 변수는 키를 포함할지 여부를 지정합니다.
get_full_path () 반환 경로 요청은 쿼리 문자열이 포함되어 있습니다. 예를 들어, "/ 음악 / 밴드 / the_beatles /? 인쇄 = 사실"
is_secure () 요청이 안전한 경우, 즉, 방출 된 빛이 HTTPS 요청이며, True를 반환.

QueryDict 객체

HttpRequest에에서 개체, GET과 POST 속성이 django.http.QueryDict 클래스 인스턴스에게 있습니다.

단일 결합에 대응하는 다중 값의 경우를 처리하기 위해 유사한 정의 사전 클래스 QueryDict.

모든 표준 사전 메소드를 구현 QueryDict. 상기 방법은 또한 특정 포함

방법 기술

__getitem__

표준 사전 프로세스는 그 키 값의 해당 번호, __의 getItem의 __ ()는 마지막 값을 반환하는 경우이며, 조금 다릅니다.

__setitem__

매개 변수를 설정하면 키의 목록의 값 (파이썬 목록)을 지정합니다. 참고 : 만 변경 가능한 QueryDict 개체 (사본이 사본 통해 ()를 QueryDict 객체를 생성)를 호출 할 수 있습니다.

() 취득

키 값에 대응하면, 복수 () 얻을 마지막 값을 반환한다.

업데이트 ()

파라미터 QueryDict 될 수 있으며, 이것은 표준 사전 될 수있다. 다른 표준 사전 업데이트 방법 및 사전 항목을 추가하는 방법이 아니라 교체보다 :

>>> 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']

항목 ()

표준 사전 항목 () 메소드는, 조금 다른 방법은 단일 값 논리 __getitem의 __을 (사용)가 있습니다 :

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]

값 ()

표준 사전 값 () 메소드는 방법) (단일 값 논리 __getitem의 __를 사용, 약간 다릅니다 :

또한, 몇 가지 방법은 다음 표있다 QueryDict :

방법 기술

복사 ()

개체의 복사본, 파이썬 표준 라이브러리 copy.deepcopy의 내부 구현을 돌려줍니다 (). 이 복사본은 변경 가능 (변경)입니다 - 즉, 당신이 복사본의 값을 변경할 수 있습니다.

getlist (키)

파이썬 목록이 반환 된 모든 매개 변수와 해당 키의 값을 반환합니다. 키가 존재하지 않는 경우는 빈 목록을 반환합니다. 어떤 종류의 목록을 반환 보장이야 ..

연주곡 (키, list_)

키 값 list_을 설정합니다 (달리 __setitem __ ()).

appendlist (키, 항목)

키와 관련된 내부 목록에 항목을 추가합니다.

setlistdefault (키 목록)

그리고 조금 다른을 setDefault,이리스트가 아닌 인수로 단일 값을 받아들입니다.

목록 ()

및 항목 ()는, 예를 들어리스트로 키 값을 모두 리턴 약간 상이하다 :

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]

를 urlencode ()

쿼리 문자열 형식을 수행하는 형식의 문자열을 반환합니다 (예를 들어, "A = 2 & B = 3 & B = 5").