WeChatミニプログラム開発への道(6)Djangoフォーム

WeChatミニプログラム開発への道(6)Djangoフォーム

HTTPリクエスト
HTTPプロトコルは、「リクエスト-リプライ」方式で機能します。クライアントがリクエストを送信すると、リクエストにデータを添付できます。リクエストを解析することで、サーバーはクライアントからデータを取得し、URLに基​​づいて特定のサービスを提供できます。
GETメソッド
ユーザーリクエストを受信するために、前のプロジェクトでsearch.py​​ファイルを作成しました。

from django.http import HttpResponse
from django.shortcuts import render
# 表单
def search_form(request):
    return render(request, 'search_form.html')
 
# 接收请求数据
def search(request):  
    request.encoding='utf-8'
    if 'cumt' in request.GET and request.GET['cumt']:
        message = '你搜索的内容为: ' + request.GET['cumt']
    else:
        message = '你提交了空表单'
    return HttpResponse(message)

ここに画像の説明を挿入
テンプレートディレクトリテンプレートにsearch_form.htmlフォームを追加します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>中国矿业大学信息安全</title>
</head>
<body>
    <form action="/search/" method="get">
        <input type="text" name="cumt">
        <input type="submit" value="搜索">
    </form>
</body>
</html>

ここに画像の説明を挿入
urls.pyルールは次のように変更されます。

from django.conf.urls import url
from . import views,testdb,search
 
urlpatterns = [
    url(r'^hello/$', views.runoob),
    url(r'^testdb/$', testdb.testdb),
    url(r'^search-form/$', search.search_form),
    url(r'^search/$', search.search),
]

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
POSTメソッド
上記では、GETメソッドを使用しました。ビュー表示とリクエスト処理は、2つの機能処理に分けられます。
POSTメソッドは、データを送信するときによく使用されます。以下ではこの方法を使用し、URLと処理関数を使用して、ビューの表示とリクエストの処理を同時に行います。
テンプレートでpost.htmlを作成します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>中国矿业大学计算机信息安全18-1班团支书</title>
</head>
<body>
    <form action="/search-post/" method="post">
        {% csrf_token %}
        <input type="text" name="cumt">
        <input type="submit" value="搜索">
    </form>
 
    <p>{
   
   { rlt }}</p>
</body>
</html>

ここに画像の説明を挿入
テンプレートの最後に、rltマークを追加して、テーブル処理結果用の場所を予約します。
フォームの最後には{%csrf_token%}ラベルもあります。csrfのフルネームはCrossSite RequestForgeryです。これは、Djangoが提供する機能であり、偽装してリクエストを送信することを防ぎます。POSTメソッドによって送信されるフォームには、このラベルが必要です。

HelloWorldディレクトリに新しいsearch2.pyファイルを作成し、search_post関数を使用してPOSTリクエストを処理します。

from django.shortcuts import render
from django.views.decorators import csrf
 
# 接收POST请求数据
def search_post(request):
    ctx ={
    
    }
    if request.POST:
        ctx['rlt'] = request.POST['cumt']
    return render(request, "post.html", ctx)

ここに画像の説明を挿入
urls.pyルールは次のように変更されます。

from django.conf.urls import url
from . import views,testdb,search,search2
 
urlpatterns = [
    url(r'^hello/$', views.hello),
    url(r'^testdb/$', testdb.testdb),
    url(r'^search-form/$', search.search_form),
    url(r'^search/$', search.search),
    url(r'^search-post/$', search2.search_post),
]

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
リクエストオブジェクト
各ビュー関数の最初のパラメータは、次のrunoob()関数のようなHttpRequestオブジェクトです。

from django.http import HttpResponse

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

HttpRequestオブジェクトには、現在のリクエストURLに関する情報が含まれています。

リクエストされたページのフルパス。ドメイン名は含まれません(例:「/ hello /」)。

方法

リクエストで使用されるHTTPメソッドの文字列表現。すべて大文字の表現。例えば:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()

GETに
は、すべてのHTTPGETパラメータの辞書のようなオブジェクトが含まれています。QueryDictのドキュメントを参照してください。
POSTに
は、すべてのHTTPPOSTパラメーターの辞書のようなオブジェクトが含まれています。QueryDictのドキュメントを参照してください。
サーバーが空のPOSTリクエストを受信する可能性もあります。つまり、フォームはHTTP POSTメソッドを介してリクエストを送信しますが、フォームにデータを含めることはできません。したがって、ステートメントifrequest.POSTを使用してHTTPPOSTメソッドを使用するかどうかを決定することはできません。ifrequest.method== "POST"を使用する必要があります(この表のメソッド属性を参照)。
注:POSTにはファイルアップロード情報は含まれていません。FILES属性を参照してください。
REQUEST
便宜上、この属性はPOST属性とGET属性のコレクションですが、特殊性があります。最初にPOST属性を探し、次にGET属性を探します。PHPの$ REQUESTから学びましょう
たとえば、GET = {"name": "john"}およびPOST = {"age": '34'}の場合、REQUEST ["name"]の値は "john"であり、REQUEST ["ageの値は「]は「34」です
。GETとPOSTを使用することを強くお勧めします。これは、これら2つの属性がより明確であり、記述されたコードが理解しやすいためです。
COOKIESに
は、すべてのCookie用の標準のPython辞書オブジェクトが含まれていますキーと値はどちらも文字列です。
FILES
には、アップロードされたすべてのファイルの辞書のようなオブジェクトが含まれています。FILESの各キーは、タグのname属性の値です。FILESの各値は、次の3つのキーを含む標準のPython辞書オブジェクトでもあります。
filename:アップロードされたファイルの名前。Python文字列で表されます。content
-type:
アップロードされたファイルのコンテンツタイプcontent:アップロードされたファイルの元のコンテンツ
注:リクエストメソッドがPOSTで、enctype = "multipartがある場合のみリクエストページFILESの/ form-data "は、データが属性である場合にのみデータを所有します。それ以外の場合、FILESは空の辞書です。
METAに
は、利用可能なすべてのHTTPヘッダー情報の辞書が含まれています。たとえば、次のように
CONTENT_LENGTH
CONTENT_TYPE
QUERY_STRING:未解析の元のクエリ文字列
REMOTE_ADDR:クライアントのIPアドレス
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.

Django AuthenticationMiddlewareプロパティでのみ、現在のセッションを表す
セッション
固有の書き込み可能な属性ディクショナリオブジェクトをアクティブ化できますこの属性は、Djangoのセッションサポートがアクティブ化されている場合にのみ使用できます。
raw_post_data
生のHTTPPOSTデータ、未解析。高度な処理に役立ちます。
Requestオブジェクトには、いくつかの便利なメソッドもあります。
メソッドの説明
getitem(key)は、GET / POSTのキー値を返し、最初にPOSTを取得し、次にGETを取得します。キーが存在しない場合、KeyErrorがスローされます。
ここで、辞書構文を使用してHttpRequestオブジェクトにアクセスできます。
たとえば、request ["foo"]はrequest.POST ["foo"]と同等であり、次にrequest.GET ["foo"]と同等です。
has_key()パラメーターで指定されたキーがrequest.GETまたはrequest.POSTに含まれているかどうかを確認します。
get_full_path()は、クエリ文字列を含むリクエストパスを返します。たとえば、 "/ music / bands / the_beatles /?print = true"
is_secure()リクエストが安全な場合、Trueを返します。つまり、HTTPSリクエストです。
QueryDictオブジェクト
HttpRequestオブジェクトでは、GET属性とPOST属性はdjango.http.QueryDictクラスのインスタンスです。
QueryDictは、辞書に似たカスタムクラスであり、単一のキーが複数の値に対応する状況を処理するために使用されます。
QueryDictは、すべての標準辞書メソッドを実装します。また、いくつかの固有のメソッドも含まれています。
メソッドの説明
getitem
と標準の辞書処理は少し異なります。つまり、Keyが複数の値に対応する場合、getitem()は最後の値を返します。
setitem
設定パラメーターは、キーの値リスト(Pythonリスト)を指定します。注:変更可能なQueryDictオブジェクト(つまり、copy()によって生成されたQueryDictオブジェクトのコピー)でのみ呼び出すことができます。get
()
キーが複数の値に対応する場合、get()は最後の値を返します。
update()
パラメーターは、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']
items()

これは、単一値論理__getitem __()を使用する標準辞書のitems()メソッドとは少し異なります。

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

>>> q.items()

[('a', '3')]
values()

標準ディクショナリのvalues()メソッドとは少し異なります。このメソッドは、単一値論理の__getitem __()を使用します。
さらに、次の表に示すように、QueryDictにもいくつかのメソッドがあります。
メソッドの説明
copy()
はオブジェクトのコピーであり、内部実装はPython標準のライブラリのcopy.deepcopy()を使用します。コピーは変更可能(変更可能)です。つまり、コピーの値を変更できます。
getlist(key)
は、パラメーターキーに対応するすべての値をPythonリストとして返します。キーが存在しない場合は、空のリストが返されます。ある種のリストを返すことが保証されています...
setlist(key、list_)
はkeyの値をlist_に設定します(setitem()とは異なり
ます)。appendlist(key、item)
はkeyに関連付けられた内部リストにアイテムを追加します
。setlistdefault( key、list)
は、パラメーターとして単一の値ではなくリストを受け入れるという点で、setdefaultとは少し異なります。
Lists()は
items ()とは少し異なり、keyのすべての値をリストとして返します(例:

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

>>> q.lists()

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

urlencode()
は、クエリ文字列形式でフォーマットされた文字列を返します(例: "a = 2&b = 3&b = 5")。

おすすめ

転載: blog.csdn.net/xulei1132562/article/details/113585322