Latest web development tutorials

รูปแบบ Django

รูปแบบ HTML เป็นเว็บไซต์โต้ตอบวิธีที่คลาสสิก บทนี้จะอธิบายวิธีการจัดการกับข้อมูลในแบบฟอร์ม Django ส่งโดยผู้ใช้


ร้องขอ HTTP

โปรโตคอล HTTP "คำขอ - ตอบ" ลักษณะ เมื่อลูกค้าส่งคำขอคุณอาจขอข้อมูลเพิ่มเติม ร้องขอความละเอียด Server คุณสามารถได้รับข้อมูลจากลูกค้าและการให้บริการที่ระบุตาม 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

ข้างต้นเราใช้วิธีการได้รับ ดูการแสดงผลและการประมวลผลคำขอของฟังก์ชั่นการรักษาออกเป็นสอง

มากกว่าปกติโพสต์วิธีการในการส่งข้อมูล เราใช้วิธีการนี้ต่อไปกับ URL และตัวจัดการยังแสดงให้เห็นถึงมุมมองและดำเนินการตามคำขอ

เราได้สร้าง post.html ใน tmplate:

<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 ปลอมขอ นี้มีให้โดย Django ป้องกันการปลอมแปลงส่งคำขอ วิธีการ POST จะส่งแบบฟอร์มที่คุณต้องมีป้ายกำกับนี้

ไฟล์ search2.py ใหม่ในไดเรกทอรี HelloWorld และการใช้ฟังก์ชั่น 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 == 'ได้รับ':
do_something ()
elif request.method == "โพสต์:
do_something_else ()

GET

มันมีทุก HTTP GET พารามิเตอร์วัตถุพจนานุกรมเหมือน ดูเอกสาร QueryDict

โพสต์

มันมีทุกพารามิเตอร์ HTTP POST วัตถุพจนานุกรมเหมือน ดูเอกสาร QueryDict

สถานการณ์คำขอ POST เซิร์ฟเวอร์ได้รับที่ว่างเปล่ายังเป็นไปได้ ในคำอื่น ๆ รูปแบบรูปแบบการส่งคำขอผ่านทางวิธี HTTP POST แต่ไม่สามารถสร้างข้อมูล ดังนั้นคำสั่งที่ไม่สามารถนำมาใช้ถ้า request.POST เพื่อพิจารณาว่าจะใช้วิธีการ HTTP POST นั้นคุณควรใช้ถ้า request.method == "โพสต์" (ดูวิธีนี้ตารางแอตทริบิวต์)

หมายเหตุ: โพสต์ไม่รวมถึงข้อมูลไฟล์ที่อัปโหลด ดูไฟล์คุณสมบัติ

คำขอ

เพื่อความสะดวกของโรงแรมแห่งนี้เป็นคอลเลกชันของโพสต์และได้รับแอตทริบิวต์ แต่มีความพิลึกตรวจสอบคุณสมบัติการโพสต์ครั้งแรกแล้วมอง GET แอตทริบิวต์ การอ้างอิงของ PHP $ _REQUEST

ตัวอย่างเช่นถ้าคุณได้รับ = { "ชื่อ": "จอห์น"} และหลัง = { "อายุ": '34'} คำขอ [ "ชื่อ"] ค่าคือ "จอห์น" [ "อายุ"] ค่าของขอเป็น "34"

ดังนั้นจึงขอแนะนำให้ใช้ GET และ POST เพราะทั้งสองคุณสมบัติของที่ชัดเจนมากขึ้นเขียนรหัสง่ายต่อการเข้าใจ

คุกกี้

คุกกี้ทั้งหมดมีมาตรฐานหลามวัตถุพจนานุกรม คีย์และค่าสตริง ดูบทที่ 12 มีคำอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับคุกกี้

ไฟล์

วัตถุพจนานุกรมเหมือนมีไฟล์ทั้งหมดที่อัปโหลด . ไฟล์แต่ละคีย์คือ <input type = "ไฟล์" name = "" /> ค่าแอตทริบิวต์แท็กชื่อไฟล์แต่ละค่ายังเป็นวัตถุพจนานุกรมหลามมาตรฐานที่มีดังต่อไปนี้สามคีย์:

  • ชื่อไฟล์: อัปโหลดชื่อไฟล์ที่มีการแสดงสตริงของงูใหญ่
  • ชนิดเนื้อหาของไฟล์ที่อัปโหลด: ประเภทเนื้อหา
  • เนื้อหาต้นฉบับไฟล์ที่อัปโหลดเนื้อหา

หมายเหตุ: เฉพาะวิธีการขอเป็นโพสต์และหน้าการร้องขอ <form> มี enctype = "multipart / form ข้อมูลแอตทริบิวต์" มีไฟล์ข้อมูลเท่านั้น มิฉะนั้นไฟล์เป็นพจนานุกรมที่ว่างเปล่า

META

ที่มีทั้งหมดที่มีส่วนหัว HTTP พจนานุกรม ตัวอย่างเช่น:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: สตริงแบบสอบถามเดิมยังไม่ได้แก้ไข
  • ที่อยู่ IP ของลูกค้า: REMOTE_ADDR
  • REMOTE_HOST: ชื่อโฮสต์ของลูกค้า
  • SERVER_NAME: เซิร์ฟเวอร์ชื่อโฮสต์
  • SERVER_PORT: พอร์ตของเซิร์ฟเวอร์

META ส่วนหัวเหล่านี้นำหน้า HTTP_ ที่สำคัญมากที่สุดตัวอย่างเช่น:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: http ข้อมูลส่วนหัวของโฮสต์ที่ส่งมาจากลูกค้า
  • HTTP_REFERER: หน้าอ้างอิง
  • HTTP_USER_AGENT: สตริง user-agent ของลูกค้า
  • HTTP_X_BENDER: X-Bender หัว

ผู้ใช้งาน

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 คุณสมบัติที่สามารถใช้ได้

เซสชั่น

คุณสมบัติเฉพาะที่สามารถเขียนได้แสดงให้เห็นว่าการใช้งานปัจจุบันของวัตถุพจนานุกรม Django เปิดใช้งานเฉพาะเมื่อเซสชั่นได้รับการสนับสนุนสถานที่ให้บริการที่มีอยู่ ดูบทที่ 12

raw_post_data

ข้อมูลดิบ HTTP POST ไม่แยกวิเคราะห์ จะมีประโยชน์เมื่อการรักษาขั้นสูง

ขอวัตถุนอกจากนี้ยังมีวิธีการที่มีประโยชน์บาง:

ทาง ลักษณะ
__getitem __ (Key) ส่งคืนกุญแจ GET / โพสต์แรกที่รับตำแหน่งหลังจากการ GET ถ้าคีย์ไม่ได้อยู่โยน KeyError
นี่คือสิ่งที่เราสามารถใช้ไวยากรณ์พจนานุกรมให้เข้าถึงวัตถุ HttpRequest
ยกตัวอย่างเช่นขอ [ "ฟู"] เทียบเท่ากับครั้งแรก request.POST [ "ฟู"] แล้ว request.GET [ "ฟู"] การดำเนินงาน
has_key () ตรวจสอบ request.GET หรือ request.POST พารามิเตอร์ระบุว่าจะรวมกุญแจ
get_full_path () คำขอเส้นทางย้อนกลับมีสตริงแบบสอบถาม ยกตัวอย่างเช่น "/ ดนตรี / วงดนตรี / the_beatles /? s พิมพ์ = true"
is_secure () หากคำขอมีความปลอดภัยกลับจริงที่เป็นแสงที่ปล่อยออกมาเป็นคำขอ HTTPS

วัตถุ QueryDict

ในวัตถุ HttpRequest รับและคุณลักษณะการโพสต์อินสแตนซ์ระดับ 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 __ valued เดียว () มีดังนี้:

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

>>> q.items()

[('a', '3')]

ค่า ()

ค่าพจนานุกรมมาตรฐาน () วิธีการที่แตกต่างกันเล็ก ๆ น้อย ๆ วิธีการใช้ตรรกะ __getitem __ valued เดียว ():

นอกจากนี้ 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")