Latest web development tutorials

أشكال جانغو

نماذج HTML هي موقع الكلاسيكية التفاعلية الطريق. يشرح هذا الفصل كيفية التعامل مع بيانات النموذج جانغو المقدمة من قبل المستخدم.


طلب HTTP

HTTP بروتوكول "طلب - رد" الطريقة. عندما يرسل العميل طلب، يمكنك طلب بيانات إضافية. طلب قرار الخادم، يمكنك الحصول على البيانات من العميل، وتقديم خدمات محددة على أساس URL.

الحصول على الطريقة

أنشأنا ملف 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 ومعالجات، وتبين أيضا وجهة نظر ومعالجة الطلب.

ولقد خلقنا 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 لتقف على الصليب الموقع طلب التزوير. يتم توفير هذه من قبل جانغو منع التزوير تقديم الطلبات. الأسلوب POST لتقديم النموذج، يجب أن يكون هذا الملصق.

ملف search2.py جديد في الدليل HelloWorld واستخدام وظيفة 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/ الوصول استعرض النتائج على النحو التالي:

بعد الانتهاء من الأمثلة المذكورة أعلاه، لدينا بنية الدليل:

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 يحتوي على بعض المعلومات حول عنوان الطلب الحالي:

ممتلكات

وصف

مسار

المسار الكامل إلى الصفحة المطلوبة، وليس بما في ذلك اسم نطاق - على سبيل المثال، "/ مرحبا /".

طريقة

طريقة سلسلة HTTP المستخدمة في تمثيل الطلب. وهي تمثل كافة الأحرف الكبيرة. على سبيل المثال:

إذا request.method == 'GET':
do_something ()
request.method أليف == 'ما بعد':
do_something_else ()

الحصول على

فهو يحتوي على كل HTTP GET معلمات القاموس يشبه كائن. راجع وثائق QueryDict.

وظيفة

أنه يحتوي على جميع المعلمات HTTP POST القاموس يشبه كائن. راجع وثائق QueryDict.

طلب POST الوضع يتلقى الخادم فارغة ممكن أيضا. وبعبارة أخرى، شكل النموذج لتقديم طلب عبر طريقة HTTP POST، ولكن لا يمكن أن تشكل البيانات. ولذلك، فإن البيان لا يمكن أن تستخدم إذا request.POST لتحديد ما إذا كان استخدام الأسلوب HTTP POST، يجب عليك استخدام إذا request.method == "POST" (انظر هذا الجدول طريقة السمة).

ملاحظة: POST لا تتضمن معلومات ملف التحميل. انظر خصائص الملفات.

طلب

للراحة، وهذه الخاصية هي عبارة عن مجموعة من الوظائف والحصول على سمة، ولكن هناك خصوصية، والتحقق من وظيفة الخاصية الأولى، ثم تبدو الحصول على السمة. إشارة PHP في _REQUEST $.

على سبيل المثال، إذا كنت احصل = { "اسم": "جون"} و POST = { "عمر": "34"}، ثم طلب [ "اسم"] القيمة "جون"، [ "عمر"] قيمة الطلب "34."

فمن المستحسن بشدة لاستخدام GET و POST، لأن هذه الصفات اثنين من أكثر وضوحا، كتابة التعليمات البرمجية أسهل للفهم.

الكوكيز

كل هذه الملفات تحتوي على معيار كائن القاموس بيثون. المفاتيح والقيم هي سلاسل. أنظر الفصل 12، وهناك تفسير أكثر تفصيلا حول ملفات تعريف الارتباط.

ملفات

قاموس تشبه الكائن الذي يحتوي على كافة الملفات التي تم تحميلها. . ملفات كل مفتاح هو <إدخال نوع = "ملف" اسم = "" /> قيمة السمة اسم العلامة ملفات كل قيمة هي أيضا كائن القاموس بيثون القياسي الذي يحتوي على ثلاثة مفاتيح التالية:

  • اسم الملف: تحميل اسم الملف مع تمثيل سلسلة من بيثون
  • نوع المحتوى من الملف الذي تم تحميله: نوع المحتوى
  • المحتوى الأصلي ملف مرفوع: المحتوى

ملاحظة: فقط على طريقة الطلب هو وظيفة، والصفحة طلب <شكل> لديه enctype = "/ شكل بيانات متعددة الأجزاء" السمة الملفات فقط لديها بيانات. خلاف ذلك، الملفات هو قاموس فارغة.

ميتا

تحتوي على كل ما هو متاح رؤوس 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: سلسلة عامل المستخدم العميل
  • 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 الخام، لا تحليل. أن تكون مفيدة عندما تقدم العلاج.

لديه طلب الكائن أيضا بعض الطرق المفيدة:

الطريق وصف
__getitem __ (مفتاح) إرجاع مفاتيح GET / وظيفة، أولا اتخاذ وظيفة، بعد أخذ GET. إذا لم المفتاح غير موجود KeyError رمي.
هذا هو ما يمكن أن نستخدمها في بناء الجملة القاموس للوصول إلى كائن HttpRequest.
على سبيل المثال، طلب [ "فو"] ما يعادل request.POST الأول [ "فو"] ثم request.GET [ "فو"] عملية.
has_key () تحقق request.GET أو تحدد request.POST المعلمة ما إذا كان لتشمل مفتاح.
get_full_path () ويتضمن طلب مسار إرجاع سلسلة الاستعلام. على سبيل المثال، "/ الموسيقى / فرق / the_beatles /؟ طباعة = صحيح"
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 __ واحد بقيمة ():

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

>>> q.items()

[('a', '3')]

القيم ()

قيم القاموس القياسية () طريقة مختلفة قليلا، يستخدم أسلوب منطق __getitem __ واحد بقيمة ():

وبالإضافة إلى ذلك، QueryDict هناك بعض الأساليب، والجدول التالي:

الطريق وصف

نسخة ()

إرجاع نسخة من الكائن، تطبيق داخلي في بيثون copy.deepcopy مكتبة القياسية (). هذه النسخة هي قابلة للتغيير (تغيير) - وهذا هو، يمكنك تغيير قيمة نسخة.

getlist (مفتاح)

جميع المعلمات والعودة قيم المفتاح المطابق، كما عادت قائمة بيثون. حالة عدم وجود المفتاح، فإنها ترجع قائمة فارغة. انها مضمونة لإرجاع قائمة من نوع ما ..

SETLIST (مفتاح، list_)

تعيين list_ قيمة الرئيسي (على عكس __setitem __ ()).

appendlist (مفتاح، البند)

إضافة هذا البند إلى مفتاح والقائمة الداخلية المرتبطة بها.

setlistdefault (مفتاح، القائمة)

وsetdefault مختلفة قليلا، فإنه يقبل القائمة بدلا من قيمة واحدة كحجة.

قوائم ()

وحدات () هي مختلفة قليلا، فإنه سيعود كافة القيم الأساسية، وقائمة، على سبيل المثال:

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

>>> q.lists()

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

urlencode ()

بإرجاع سلسلة منسقة لأداء شكل سلسلة الاستعلام (على سبيل المثال، "و= 2 & ب = 3 و ب = 5").