รูปแบบ 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 == 'ได้รับ': |
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 พจนานุกรม ตัวอย่างเช่น:
META ส่วนหัวเหล่านี้นำหน้า 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 คุณสมบัติที่สามารถใช้ได้ |
เซสชั่น | คุณสมบัติเฉพาะที่สามารถเขียนได้แสดงให้เห็นว่าการใช้งานปัจจุบันของวัตถุพจนานุกรม 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") |