Latest web development tutorials

bentuk Django

bentuk HTML adalah cara website interaktif klasik. Bab ini menjelaskan bagaimana menangani data formulir Django yang diajukan oleh pengguna.


permintaan HTTP

HTTP protokol "Permintaan - Reply" cara. Ketika klien mengirimkan permintaan, Anda dapat meminta data tambahan. permintaan resolusi Server, Anda bisa mendapatkan data dari klien, dan untuk menyediakan layanan tertentu berdasarkan URL.

GET Metode

Kami menciptakan sebuah file search.py ​​sebelum proyek, untuk menerima permintaan pengguna:

# -*- 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)

Tambahkan bentuk template search_form.html di direktori template:

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

Aturan urls.py diubah sebagai berikut:

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),
)

alamat akses: http: //192.168.45.3: 8000 / pencarian bentuk / dan pencarian, hasilnya adalah sebagai berikut:

metode POST

Di atas kita menggunakan metode GET. Lihat tampilan dan fungsi pengolahan permintaan menjadi dua pengobatan.

Lebih umum POST metode untuk mengirimkan data. Kami menggunakan metode ini sebagai berikut, dengan URL dan penangan, juga menunjukkan pandangan dan memproses permintaan.

Kami menciptakan post.html di 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>

Pada akhir template, kami menambahkan tanda placeholder RLT untuk hasil tabel.

Ada juga meja {% csrf_token%} tag kemudian. CSRF adalah singkatan dari Cross Site Request Pemalsuan. Ini disediakan oleh Django mencegah pemalsuan mengajukan permintaan. Metode POST untuk mengirimkan formulir, Anda harus memiliki label ini.

File search2.py baru di direktori HelloWorld dan menggunakan fungsi search_post untuk menangani permintaan 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)

Aturan urls.py diubah sebagai berikut:

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),
)

Akses http://192.168.45.3:8000/search-post/ Tampilan hasil sebagai berikut:

Setelah selesai dari contoh di atas, struktur direktori kami:

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

Permintaan Obyek

Setiap fungsi tampilan argumen pertama adalah obyek HttpRequest, tepat di bawah hello () fungsi:

from django.http import HttpResponse

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

objek HttpRequest berisi beberapa informasi tentang URL permintaan saat ini:

milik

deskripsi

path

Path lengkap ke halaman yang diminta, tidak termasuk nama domain - misalnya, "/ halo /".

metode

Metode String HTTP digunakan dalam representasi permintaan. Ini mewakili semua huruf besar. Sebagai contoh:

jika request.method == 'GET':
do_something ()
Elif request.method == 'POST':
do_something_else ()

GET

Ini berisi semua HTTP GET parameter objek kamus-seperti. Lihat dokumentasi QueryDict.

POST

Ini berisi semua parameter HTTP POST kamus-seperti objek. Lihat dokumentasi QueryDict.

Situasi permintaan POST server menerima kosong juga mungkin. Dengan kata lain, bentuk formulir untuk mengirimkan permintaan melalui metode HTTP POST, tetapi tidak dapat membentuk data. Oleh karena itu, pernyataan itu tidak dapat digunakan jika request.POST untuk menentukan apakah akan menggunakan metode HTTP POST, Anda harus menggunakan jika request.method == "POST" (lihat tabel ini metode atribut).

Catatan: POST tidak termasuk informasi file-upload. Lihat FILES properti.

REQUEST

Untuk kenyamanan, properti ini adalah kumpulan POST dan GET atribut, tapi ada kekhususan, memeriksa POST properti pertama, kemudian lihat GET atribut. Referensi PHP $ _REQUEST.

Misalnya, jika Anda GET = { "name": "john"} dan POST = { "usia": '34'}, kemudian MEMINTA [ "nama"] nilai adalah "john", [ "usia"] nilai REQUEST adalah "34."

Hal ini sangat dianjurkan untuk menggunakan GET dan POST, karena kedua atribut yang lebih eksplisit, ditulis kode lebih mudah untuk memahami.

COOKIES

Semua cookie berisi standar Python kamus objek. Kunci dan nilai-nilai string. Lihat Bab 12, ada penjelasan yang lebih rinci tentang cookie.

FILES

Kamus-seperti objek yang berisi semua file upload. . File Setiap Key adalah <input type = "file" name = "" /> nama tag nilai atribut FILES setiap nilai juga merupakan objek Python kamus standar yang berisi tiga Keys berikut:

  • nama file: Unggah nama file dengan representasi string Python
  • jenis konten dari file upload: konten-jenis
  • Asli isi file upload: konten

Catatan: Hanya metode permintaan adalah POST, dan halaman permintaan <form> memiliki enctype = "multipart / form-data" atribut FILES hanya memiliki data. Jika tidak, FILES adalah kamus kosong.

META

Mengandung semua tersedia header HTTP kamus. Sebagai contoh:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: terselesaikan asli string
  • alamat IP klien: REMOTE_ADDR
  • REMOTE_HOST: klien nama host
  • SERVER_NAME: Server Host Name
  • SERVER_PORT: port server

META header ini diawali HTTP_ paling Key, misalnya:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP informasi header host yang dikirim oleh klien
  • HTTP_REFERER: Halaman merujuk
  • HTTP_USER_AGENT: klien string agen pengguna
  • HTTP_X_BENDER: X-Bender sundulan

pemakai

Django.contrib.auth.models.User adalah obyek yang mewakili pengguna saat login.

Jika Anda mengakses pengguna saat ini belum login, pengguna akan diinisialisasi contoh django.contrib.auth.models.AnonymousUser.

Anda dapat diidentifikasi dengan is_authenticated metode pengguna () dari pengguna login:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.

Django diaktifkan hanya ketika AuthenticationMiddleware properti ini tersedia

sidang

Satu-satunya properti yang bisa ditulis yang mewakili sesi saat ini objek kamus. Django diaktifkan hanya ketika sesi didukung properti yang tersedia. Lihat Bab 12.

raw_post_data

Data HTTP POST mentah, tidak diurai. Berguna saat maju pengobatan.

Permintaan objek juga memiliki beberapa metode yang berguna:

cara deskripsi
__getitem __ (key) Mengembalikan tombol GET / POST, pertama mengambil POST, setelah mengambil GET. Jika kunci tidak ada KeyError lemparan.
Ini adalah apa yang dapat kita gunakan sintaks kamus untuk mengakses objek HttpRequest.
Misalnya, meminta [ "foo"] setara dengan request.POST pertama [ "foo"] kemudian request.GET [ "foo"] operasi.
has_key () Periksa request.GET atau request.POST parameter menentukan apakah akan menyertakan Key.
get_full_path () permintaan kembali jalur mengandung string query. Misalnya, "/ music / band / the_beatles /? Print = true"
is_secure () Jika permintaan tersebut aman, kembali Benar, yaitu, cahaya yang dipancarkan adalah HTTPS permintaan.

benda QueryDict

Dalam HttpRequest objek, GET dan atribut POST adalah contoh kelas django.http.QueryDict.

QueryDict kelas kamus khusus yang mirip dengan menangani kasus multi-nilai yang sesuai dengan ikatan tunggal.

QueryDict menerapkan semua metode kamus standar. Metode ini juga termasuk yang spesifik:

cara deskripsi

__getitem__

Proses kamus standar sedikit berbeda, yaitu, jika angka yang sesuai Key Nilai, __ getItem __ () mengembalikan nilai terakhir.

__setitem__

Pengaturan parameter menentukan nilai dari daftar kunci (daftar Python). Catatan: Ini hanya dapat disebut (copy melalui copy () dihasilkan benda QueryDict) pada objek QueryDict bisa berubah.

mendapatkan ()

Jika kunci yang sesuai dengan pluralitas nilai, dapatkan () mengembalikan nilai terakhir.

update ()

Parameter dapat QueryDict, itu bisa menjadi kamus standar. Berbeda standar metode update kamus dan metode menambahkan item kamus, daripada menggantinya:

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

item ()

Ada item kamus standar () metode ini sedikit berbeda, metode ini menggunakan logika __getitem __ bernilai tunggal ():

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

>>> q.items()

[('a', '3')]

nilai-nilai ()

Nilai-nilai kamus standar () metode ini sedikit berbeda, metode ini menggunakan logika __getitem __ bernilai tunggal ():

Selain itu, QueryDict ada beberapa metode, tabel berikut:

cara deskripsi

copy ()

Mengembalikan salinan dari objek, pelaksanaan internal Python standar copy.deepcopy perpustakaan (). copy ini bisa berubah (berubah) - yaitu, Anda dapat mengubah nilai salinan.

getList (key)

Semua parameter dan mengembalikan nilai-nilai yang sesuai kunci, sebagai daftar Python kembali. Jika kunci tidak ada, ia mengembalikan daftar kosong. Ini dijamin untuk kembali daftar dari beberapa macam ..

setlist (kunci, list_)

Set nilai kunci list_ (tidak seperti __setitem __ ()).

appendlist (kunci, item)

Menambahkan item ke tombol dan daftar internal terkait.

setlistdefault (kunci, daftar)

Dan setdefault sedikit berbeda, ia menerima daftar daripada nilai tunggal sebagai argumen.

daftar ()

Dan item () adalah sedikit berbeda, ia akan mengembalikan semua nilai-nilai kunci, sebagai daftar, misalnya:

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

>>> q.lists()

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

urlencode ()

Mengembalikan string diformat untuk melakukan format string (misalnya, "a = 2 & b = 3 & b = 5").