Latest web development tutorials

forme Django

moduli HTML sono il classico sito web interattivo modo. Questo capitolo spiega come gestire i dati del modulo Django presentate da un utente.


richiesta HTTP

Protocollo HTTP "Richiesta - Reply" maniera. Quando il client invia una richiesta, è possibile richiedere ulteriori dati. richiesta di risoluzione Server, è possibile ottenere i dati dal client, e per fornire specifici servizi basati su URL.

metodo GET

Abbiamo creato un file search.py ​​prima che il progetto, per la ricezione di una richiesta dell'utente:

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

Aggiungere modello di modulo search_form.html nella directory dei modelli:

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

regola urls.py è modificato come segue:

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

indirizzo di accesso: http: //192.168.45.3: 8000 / search-forma / e di ricerca, i risultati sono i seguenti:

metodo POST

Sopra abbiamo usato il metodo GET. Vista display e funzioni di elaborazione richiesta in due trattamento.

Più comunemente POST metodo per inviare i dati. Usiamo il seguente questo metodo, con un URL e gestori, mostra anche la vista e elaborare la richiesta.

Abbiamo creato post.html in 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>

Alla fine del modello, abbiamo aggiunto un segnaposto segno di RLT per i risultati del tavolo.

C'è anche una tabella di tag {% csrf_token%} tardi. CSRF acronimo di Cross Site Request Forgery. Questo è fornito da Django a prevenire la contraffazione inviare richieste. metodo POST per inviare il modulo, è necessario disporre di questa etichetta.

Nuovo file search2.py nella directory HelloWorld e utilizzare la funzione search_post per gestire le richieste 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)

regola urls.py è modificato come segue:

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/~~number=plural Accesso Risultati come segue:

Dopo il completamento dei suddetti esempi, la nostra struttura directory:

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

Object Request

Ogni funzione di visualizzazione il primo argomento è un oggetto HttpRequest, appena sotto la funzione ciao ():

from django.http import HttpResponse

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

HttpRequest oggetto contiene alcune informazioni sulla URL richiesta corrente:

proprietà

descrizione

sentiero

Il percorso completo della pagina richiesta, non compreso il nome di dominio - per esempio, "/ ciao /".

metodo

Metodo String HTTP utilizzato nella rappresentazione richiesta. Rappresenta tutto in maiuscolo. Ad esempio:

se request.method == 'GET':
fa_qualcosa ()
elif request.method == 'post':
do_something_else ()

GET

Contiene tutte HTTP ottenere i parametri dizionario-come oggetto. Vedere la documentazione QueryDict.

POST

Esso contiene tutti i parametri HTTP POST oggetto dizionario-like. Vedere la documentazione QueryDict.

Situazione richiesta POST server riceve vuoto è anche possibile. In altre parole, la forma form per inviare una richiesta tramite il metodo HTTP POST, ma non può formare i dati. Pertanto, la dichiarazione non può essere utilizzato se request.POST per determinare se utilizzare il metodo HTTP POST, si dovrebbe usare se request.method == "POST" (si veda questo attributo metodo della tabella).

Nota: POST non include le informazioni sul file-upload. Vedere file di proprietà.

RICHIESTA

Per comodità, questa struttura è una raccolta di POST e GET attributo, ma ci particolarità, controllando POST prima proprietà, poi guardare GET attributo. di $ _REQUEST PHP.

Ad esempio, se si ottiene = { "name": "John"} e POST = { "età": '34'}, quindi richiesta [ "nome"] valore è "John", [ "età"] il valore della richiesta viene "34."

Si raccomanda vivamente di utilizzare GET e POST, perché questi due attributi di un più esplicito, scritto il codice più facile da capire.

COOKIES

Tutti i cookie contengono oggetto dizionario standard di Python. Chiavi e valori sono stringhe. Vedere il Capitolo 12, vi è una spiegazione più dettagliata sui cookie.

FILE

Dizionario-come oggetto che contiene tutti i file caricati. . I file di ogni tasto è <input type = nome di "file" = "" /> valore di attributo nome del tag file ogni valore è anche un oggetto dizionario Python standard che contiene i seguenti tre tasti:

  • filename: carica un nome di file con una rappresentazione di stringa di Python
  • Tipo di contenuto del file caricato: tipo di contenuto
  • contenuto del file originale caricato: contenuti

Nota: solo il metodo di richiesta è POST, e la pagina di richiesta <form> ha enctype = "/ form-data" multipart attributo file solo avere i dati. In caso contrario, Files è un dizionario vuoto.

META

Contenente tutti dizionario intestazioni HTTP disponibile. Ad esempio:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: irrisolto stringa di query originale
  • indirizzo IP del client: REMOTE_ADDR
  • REMOTE_HOST: cliente nome host
  • SERVER_NAME: Nome server host
  • SERVER_PORT: porta del server

META queste intestazioni precedute HTTP_ più chiave, ad esempio:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: HTTP informazioni di intestazione host inviato dal client
  • HTTP_REFERER: pagina di riferimento
  • HTTP_USER_AGENT: stringa user-agent del cliente
  • HTTP_X_BENDER: X-Bender intestazione

utente

Django.contrib.auth.models.User è un oggetto che rappresenta l'utente attualmente connesso.

Se si accede l'utente non è attualmente connesso, l'utente verrà inizializzato istanza di django.contrib.auth.models.AnonymousUser.

Si può essere identificato con il metodo is_authenticated dell'utente () di un utente è connesso:

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

Django attivato solo quando la AuthenticationMiddleware La proprietà è disponibile

sessione

L'unica proprietà scrivibile che rappresenta la sessione corrente dell'oggetto dizionario. Django attivata solo quando la sessione ha sostenuto la proprietà è disponibile. Vedere il Capitolo 12.

raw_post_data

dati HTTP POST grezzi, non analizzati. Essere utile quando avanzato trattamento.

Richiesta oggetto ha anche alcuni metodi utili:

modo descrizione
__getitem __ (chiave) Restituisce i tasti GET / POST, in primo luogo prendere POST, dopo l'assunzione di GET. Se la chiave non esiste KeyError tiro.
Questo è ciò che possiamo utilizzare la sintassi dizionario per accedere HttpRequest oggetto.
Ad esempio, richiesta [ "foo"] è equivalente al primo request.POST [ "foo"] then request.GET [ "foo"] operazione.
has_key () Controllare request.GET o parametro request.POST di specificare se includere la chiave.
get_full_path () Richiesta percorso di ritorno contiene una stringa di query. Ad esempio, "/ music / band / the_beatles / Stampa = true"
is_secure () Se la richiesta è sicura, restituirà True, cioè, la luce emessa è HTTPS richieste.

oggetti QueryDict

In HttpRequest oggetto, GET e POST attributi sono istanze della classe django.http.QueryDict.

QueryDict simile classe di dizionario personalizzato per gestire il caso di multi-valore corrispondente ad un singolo legame.

QueryDict implementare tutti i metodi dei dizionari standard. Il metodo comprende anche specifici:

modo descrizione

__getitem__

processo dizionario standard è un po 'diverso, vale a dire, se il corrispondente numero di Chiave Valore, __ getitem __ () restituisce l'ultimo valore.

__setitem__

Impostazione parametro specifica il valore di un elenco di chiave (una lista Python). Nota: Si può essere chiamato solo (copia è attraverso la copia () generato un oggetto QueryDict) su un oggetto QueryDict mutabile.

get ()

Se il tasto corrispondente alla pluralità di valori, get () restituisce l'ultimo valore.

update ()

I parametri possono essere QueryDict, può essere un dizionario standard. Diverso metodo di aggiornamento dizionario standard e il metodo di aggiunta delle voci del dizionario, anziché sostituire:

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

articoli ()

Ci sono le voci del dizionario standard () metodo è un po 'diverso, il metodo utilizza una logica __getitem __ valore singolo ():

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

>>> q.items()

[('a', '3')]

valori ()

I valori dizionario standard () metodo è un po 'diverso, il metodo utilizza un unico valore logica __getitem __ ():

Inoltre, QueryDict ci sono alcuni metodi, la seguente tabella:

modo descrizione

copy ()

Restituisce una copia dell'oggetto, l'implementazione interna in Python copy.deepcopy libreria standard (). Questa copia è mutevole (modificabile) - vale a dire, è possibile modificare il valore della copia.

GetList (chiave)

Tutti i parametri ei valori restituiti del tasto corrispondente, come una lista Python restituito. Se la chiave non esiste, restituisce una lista vuota. E 'garantito per restituire un elenco di qualche tipo ..

setlist (chiave, List_)

Impostare la chiave valore List_ (a differenza __setitem __ ()).

appendlist (chiave, voce)

Aggiungere la voce alla chiave e la lista interna associata.

setlistdefault (chiave, lista)

E setDefault un po 'diverso, accetta la lista, piuttosto che un singolo valore come argomento.

liste ()

E gli elementi () è un po 'diverso, si tornerà tutti i valori chiave, come una lista, per esempio:

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

>>> q.lists()

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

UrlEncode ()

Restituisce una stringa formattata per eseguire il formato stringa di ricerca (ad esempio, "a = 2 & b = 3 & b = 5").