[ジャンゴ]ビューシステム--2019-08-17六時48分00秒

オリジナル:http://blog.gqylpy.com/gqy/262

「@
***
ビュー機能(クラス)は、ビューと呼ばれる、Pythonは要求を受け取り、ウェブWeb応答を返す単純な関数(クラス)です。

応答は、ページのHTMLコンテンツ、リダイレクト、404エラー、XMLドキュメント、または絵かもしれません。

どんなにビュー自体はロジックが含まれているものを、それが応答を返さない必要があります。それはあなたの現在のディレクトリのプロジェクトである限り、それは問題ではないコードを書きます。またそこには、より必要とされない、と言うことができ、「何も魔法の場所を。」

コードが統一された位置に配置するために、それは下品な場所に名前のプロジェクト(プロジェクト)またはアプリケーション(アプリ)ディレクトリ内のビュー合意されたviews.pyファイルを。

単純なビュー:

# 以HTML文档的形式返回当前日期和时间
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = '<html><body>It is now %s.</body></html>' % now
    return HttpResponse(now)

私たちはラインで上記のコード行を説明しましょう:

  1. まず、私たちはクラスのHttpResponseをインポートし、Django.httpモジュールからPythonのdatetime型ライブラリ。
  2. 次に、我々は、ビューと呼ばれる関数current_datetime関数を定義し、各ビューの機能は、最初のパラメータとしてのHttpRequestオブジェクトを適用し、そして一般==要求==知られています。
  3. このビューには、生成された応答が含まれているHttpResponseオブジェクトを返します。==各ビュー関数はHttpResponseに==を返却する責任があります。

Djangoは、システムの状態を通過し、リクエストとレスポンスのオブジェクトを使用しています

ブラウザがサーバーからページを要求すると、要求に関するメタデータを含むジャンゴのHttpRequestオブジェクトを作成します。その後、Djangoは適切なビュー、最初のパラメータとして機能するには、このビューのHttpRequestオブジェクトをロードする

各ビューはのHttpResponseを返す責任があります。

FBVとCBV

FBVに基づいて(機能ベースのビュー)ビュー機能
ビュークラスに基づいて、CBV(クラスベースビュー)。

同じロジックについては、FBVとCBVは言葉遣い:
FBV

from django.shortcuts import render, redirect

def classes_add(request):
    if request.method == 'POST':
        add_classes_name = request.POST.get('add_classes_name')  # 提取班级名称
        Classes.objects.create(name=add_classes_name)  # 将新建班级写入数据库
        return redirect('/classes/')  # 跳转至展示页面
    return render(request, 'classes_add.html')  # 返回添加页面

# urls文件
url(r'^classes_add/$', views.classes_add),

CBV

from django.shortcuts import render, redirect
from django.views import View

class ClassesAdd(View):
    # 可自定义允许的请求
    # http_method_names = ['get', 'post']

    # 处理get请求的逻辑
    def get(self, request):
        return render(request, 'classes_add.html')  # 返回添加页面

    # 处理post请求的逻辑
    def post(self, request):
        add_classes_name = request.POST.get('add_classes_name')  # 提取班级名称
        Classes.objects.create(name=add_classes_name)  # 将新建班级写入数据库
        return redirect('/classes/')  # 跳转至展示页面

# urls文件
url(r'^classes_add/$', views.ClassesAdd.as_view()),


ビューデコレータに追加

FBV自体が機能するので、機能および一般的なデコレータ差がないために添加されます。

デコレーターの装飾CBV

独立した機能が同一でないメソッドのクラスは、メソッドを直接デコレータクラスの関数に適用することができない、我々はデコレータに変換する方法を必要としています。
==装飾的な機能のためのDjangoのmethod_decoratorデコレータを提供しますこの方法は、デコレータに変換します。==

次のようにデコレータ機能は次のとおりです。

import time

def wrapper(fn):
    def inner(*args, **kwargs):
        start_time = time.time()
        ret = fn(*args, **kwargs)
        end_time = time.time()
        print("used:", end_time - start_time)
        return ret
    return inner

次のように装飾CBVは言葉遣い:

from django.shortcuts import render, redirect
from django.views import View
# 导入method_decorator
from django.utils.decorators import method_decorator

class ClassesAdd(View):

    # 处理get请求的逻辑
    @method_decorator(wrapper)  #!
    def get(self, request):
        return render(request, 'classes_add.html')  # 返回添加页面

    # 处理post请求的逻辑
    @method_decorator(wrapper)  #!
    def post(self, request):
        add_classes_name = request.POST.get('add_classes_name')  # 提取班级名称
        Classes.objects.create(name=add_classes_name)  # 将新建班级写入数据库
        return redirect('/classes/')  # 跳转至展示页面

発送について()メソッド

このような、CBVを使用しているときに、バッチ処理のための特定の要求を必要とする場合、要求はまず、などを取るにつれて、派遣()メソッドを実行するためにポストを来る、と私たちは手動で、サブクラスでこのメソッドをオーバーライドすることができたときに操作の一部を行うことに注意すべきです実際、操作にFBVに同じ効果をデコレータを追加します。

from django.shortcuts import render, redirect
from django.views import View

class ClassesAdd(View):

    # 可自定义处理请求前后的逻辑
    def dispatch(self, request, *args, **kwargs):
        # 处理请求之前的逻辑
        ret = super().dispatch(request, *args, **kwargs)
        # 处理请求之后的逻辑
        return ret

    # 处理get请求的逻辑
    def get(self, request):
        return render(request, 'classes_add.html')  # 返回添加页面

    # 处理post请求的逻辑
    def post(self, request):
        add_classes_name = request.POST.get('add_classes_name')  # 提取班级名称
        Classes.objects.create(name=add_classes_name)  # 将新建班级写入数据库
        return redirect('/classes/')  # 跳转至展示页面


RequestオブジェクトのResponseオブジェクト

リクエストオブジェクト

ページが要求されると、Djangoは、この要求のHttpRequestの目的は、元のメッセージが含まれて作成されます。
ジャンゴこのオブジェクトは自動的にビューの適切な関数に渡される、一般的なビュー機能をオブジェクトパラメータを受信規則==要求==を用いて、
公式文書
***

リクエスト関連のプロパティ

プロパティ 説明
PATH_INFO コンテンツなしのURLにアクセスするためのユーザーを返し、およびドメイン名?戻ります
方法 使用されるHTTPリクエストの文字列表現の方法は、すべて大文字で表し
取得する すべてのHTTP GETパラメータを含む辞書のようなオブジェクト
役職 すべてのHTTP POSTパラメータを含む辞書のようなオブジェクト
リクエストボディ、バイトタイプは、request.POSTデータがに体内から抽出されます

その他のプロパティ

特に断りのない限り、すべてのプロパティは、読み取り専用と考えるべきです。

行のHttpRequestクラス属性にパッケージの内容物に関連するDjangoの要求パケットヘッダ情報、
特別な指示に加えて、他のものは、読み取り専用です。

== ==方式
要求方式を表す文字列(通常はHTTPまたはHTTPS)

== ==本体
要求メッセージ本体を表す文字列。非常に便利なように、メッセージの非HTTP形式を扱うとき:ようにバイナリファイル、XML、JSONと
しかし、あなたは、フォームデータを処理したい場合は、それをPOSTすることをお勧めします。
また、我々はまた、詳細には、それを動作させるためにはPythonのクラスファイルのメソッドを使用することができます基準request.read()メソッド。

== ==パス
リクエスト経路の成分を表す文字列(ドメイン名とコンテンツを除く?後)

== ==コード
送信されたデータを表す文字列をエンコードしますモード。
なし、表現が使用されているDEFAULT_CHARSETセットした場合、デフォルトは「UTF-8」。
このプロパティは書き込み可能で、変更は任意のアクセス属性になった後、あなたは、それを修正することによって、使用される符号化されたアクセスのフォームデータを変更することができます値は、(例えば、GETまたはPOSTデータを読み取る)。新たな符号化が使用され
、それがフォームデータエンコーディングをDEFAULT_CHARSETないと判定された場合、それが使用される。

== == POST
同様のオブジェクト辞書、リクエストがフォームデータに含まれている場合、その後のQueryDictデータオブジェクトにパッケージ。
空の辞書とPOST POSTリクエストをすることができます- 。任意のデータ形式を持っていないHTTPのPOSTメソッドを経由して送信され、それはまだのQueryDictオブジェクトが作成されます
ので、我々が使用if request.method == 'POST':しますが、POSTメソッドを使用しての代わりに使用しているかどうかを判断するためにif request.method:
さらに使用する場合は、 POSTは、ファイル、ファイルの情報は、ファイルのプロパティに含まれますアップロードしました。

== ==クッキー
クッキーのすべてを含む標準のPython辞書を、キーと値は文字列です。

== ==ファイル
の辞書のようにすべてのアップロード情報を含む。オブジェクト
ファイル各結合はの<input type =「ファイル」名である =「」/> 対応するデータと比較して名前で、値。
この方法は、唯一要求ファイルPOSTであることに注意してくださいとENCTYPE =「マルチパート/フォームデータを送信する場合、<FORM>フォームは、 」 データに含まれます。そうでない場合、FILESは空の辞書ライクオブジェクトになります。

== ==セッション
オブジェクトは、現在のセッションを示し、読んでも書き込みに辞書に似ています。
Djangoが利用できるサポートセッションを有効にする場合にのみ。
セッションに関する完全な詳細についてのマニュアルを参照してください。

== META ==
すべてのヘッダHTTPを含む標準のPython辞書。
特定のヘッダ情報は、クライアントとサーバに依存する。

CONTENT_LENGTH -要求(文字列)の本体の長さ。
MIMEタイプtext要求- CONTENT_TYPE。
HTTP_ACCEPT -債権のContent-Typeレスポンス。
HTTP_ACCEPT_ENCODING -応答は、符号化された受信されてもよいです。
HTTP_ACCEPT_LANGUAGE -レスポンスは、言語を受信することができます。
HTTP_HOST -顧客によって送信されたHTTP Hostヘッダ。
HTTP_REFERER -のページを参照。
HTTP_USER_AGENT -クライアントのユーザーエージェント文字列。
QUERY_STRING -クエリ文字列(不解析さ形)の形で単一のストリング。
REMOTE_ADDR -クライアントのIPアドレス。
REMOTE_HOST -クライアントのホスト名。
REMOTE_USER -ユーザ認証サーバの後。
REQUEST_METHOD -など"GET"または"POST"などの文字列、。
SERVER_NAME -サーバーのホスト名。
SERVER_PORT -サーバポート(文字列)。

上から見た、と加えCONTENT_LENGTH CONTENT_TYPEに、任意のHTTPリクエストヘッダがMETAキーに変換すると
アンダースコアコネクタプラスHTTP_接頭辞に置き換え、すべて大文字、最終的にあります。
だから、X-ベンダーは、META HTTP_X_BENDER結合に頭に変換と呼ばれます。

==ユーザ==
オブジェクトAUTH_USER_MODELタイプ、現在ログインしているユーザを示している。
なしユーザーログインが存在しない場合、ユーザは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を利用できる有効なユーザーのみとき

匿名ユーザー:クラスmodels.AnonymousUser
django.contrib.auth.models.AnonymousUser Django.contrib.auth.models.Userクラスのインターフェイスを実装していますが、以下のいくつかの異なるとポイント:

。上記のIDを言及することは、常にNoneです
。usernameは、常に空の文字列になります
。GET_USERNAME()は常に空の文字列を返します
。is_staffとIS_SUPERUSERは常にFalseです
。is_activeは常にFalseです
。グループとuser_permissionsという常に空
(is_anonymous)が代わりにTrueを返します。偽
)(is_authenticatedではなく、真のFalseを返します。
set_password()、check_password()、保存()、[削除]()NotImplementedErrorエラーがスローされます
ジャンゴ1.8の新機能:
新しいAnonymousUser.get_username()は、より良いジャンゴをシミュレートします。 contrib.auth.models.User。

ファイルの例をアップロードします。

def upload(request):
    if request.method == 'POST':
        file_obj = request.FILES.get('file')  # 获取文件对象(获取文件信息要用FILES)
        upload_file_path = os.path.join(settings.BASE_DIR, 'upload_file', file_obj.name)  # 文件上传路径, file_obj.name为str类型
        # 判断文件是否存在的逻辑
        if os.path.exists(upload_file_path):
            name, suffix = file_obj.name.split('.')  # 切割文件名与文件后缀
            file_name = name + "_文件副本1." + suffix  # 重新拼接文件名
            upload_file_path = os.path.join(settings.BASE_DIR, 'upload_file', file_name)  # 文件上传路径
            # 判断文件是否有副本的逻辑
            if os.path.exists(upload_file_path):
                file_list = os.listdir(os.path.dirname(upload_file_path))
                # 获取所有副本文件
                file_copy_num = []
                for i in file_list:
                    if name not in i: continue
                    copy_num = i.split('.')[0][-1]  # 提取副本数字
                    if copy_num == name[-1]: continue
                    file_copy_num.append(copy_num)
                file_copy_max = int(max(file_copy_num))  # 提取最大的副本数字
                file_name = name + "_文件副本" + str(file_copy_max + 1) + '.' + suffix
                upload_file_path = os.path.join(settings.BASE_DIR, 'upload_file', file_name)  # 文件上传路径
        with open(upload_file_path, 'wb') as f:
            [f.write(chunk) for chunk in file_obj.chunks()]  # 从文件里一点一点的读数据,写到文件里
        return HttpResponse("文件上传成功!")  # 返回提示信息
    return render(request, 'upload.html')  # 返回上传页面

方法

get_host == ==

HTTP_X_FORWARDED_HOST(オープンUSE_X_FORWARDED_HOST場合、falseデフォルト)HTTP_HOSTヘッダ情報によれば、要求元のホストを返します。

2つのヘッダは、適切な値を提供し、その後、サーバー名SERVER_PORTを使用しない場合は、PEP 3333に詳細に記載されています。

USE_X_FORWARDED_HOST:ヘッダX-転送先ホストの使用を優先するかどうかを指定するブール値、ヘッダのみのプロキシ設定の場合に、使用することができます。

例:127.0.0.1:8000

注:ホストは複数のエージェントの背後に配置されている場合、get_host()メソッドは失敗します。あなたは、ヘッダーを使用しない限り、ミドルウェアプロキシを書き換えます。

get_full_path == ==は

要求の完全なパスを返します。
例:/リスト/テスト/名= zyk?

get_signed_cookie ==(キー、デフォルト= RAISE_ERROR、=塩「」、max_ageの=なし)==は

署名が有効django.core.signing.BadSignatureが返されない場合は署名に対応するCookie値を返します。

あなたは、デフォルトパラメータを指定した場合、それは例外をスローし、デフォルトの値を返しません。

オプションのパラメータ塩は、セキュリティキーブルートフォース攻撃のための追加の保護を提供するために使用することができます。時間に対応するタイムスタンプをチェックするためのmax_ageのクッキーパラメータは、確保するためにmax_ageのクッキー秒を超えないこと。

>>> request.get_signed_cookie('name')
       'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
       'Tony' # 假设在设置cookie的时候使用的是相同的salt
>>> request.get_signed_cookie('non-existing-cookie')
        ...
        KeyError: 'non-existing-cookie'    # 没有相应的键时触发异常
>>> request.get_signed_cookie('non-existing-cookie', False)
        False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
        ...
        BadSignature: ...   
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
        False

is_secure ==()==

リクエストが安全であるならば、それはそれはHTTPSリクエストによって開始され、Trueを返します。

is_ajax == ==

リクエストがXMLHttpRequestをによって開始されている場合は、それぞれのヘッダ文字列「のXMLHttpRequest」かどうかを確認することで、HTTP_X_REQUESTED_WITHをTrueを返します。

最近のほとんどのJavaScriptライブラリは、このヘッドに送信されます。あなたは(ブラウザ側の)あなた自身のXMLHttpRequest呼び出しを記述する場合は、手動でis_ajaxを作るために、この値を設定する必要があります()作業することができます。

応答は要求がAJAXによって開始され、そしてあなたは、このようなDjangoのキャッシュミドルウェアとしてキャッシュのいくつかのフォームを使用しているかどうかに基づいて、必要な場合は、あなたのビューでは、応答が正しくキャッシュされることができるように飾らvary_on_headers(「HTTP_X_REQUESTED_WITH」)を使用する必要があります。

注:キーと値のペアの複数(例えば、チェックボックス入力タイプ)、なぜなら使用GetListの()メソッドの。

レスポンスオブジェクト

HttpRequestオブジェクトはジャンゴによって自動的に作成されると比較して、のHttpResponseオブジェクトは、私たちの責任であり、私たちは、それぞれのビューはHttpResponseにを記入し、返却、インスタンス化する必要があります。書き込み
はHttpResponseクラスにあるdjango.httpモジュール。

文字列を渡します。

from django.http import HttpResponse
response = HttpResponse("Here's the text of the Web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")

設定または削除応答メッセージヘッダ:

response = HttpResponse()
response['Content-Type'] = 'text/html; charset=UTF-8'
del response['Content-Type']

プロパティ

  • HttpResponse.content:応答内容
  • HttpResponse.charset:応答コードの内容
  • HttpResponse.status_code:応答の状態、それ

    JsonResponseオブジェクト

    JsonResponseは、JSONエンコードされたレスポンスを生成するように設計のHttpResponseのサブクラスです。

from django.http import JsonResponse

def test(request):
    dct = {'name': 'zyk', 'sex': 'boy'}
    response = JsonResponse(dct)
    print(response.content)
    return response

あなたはデータの非辞書の種類を渡したい場合は、デフォルトでは唯一の偽=安全のパラメータを設定する必要があり、データ・ディクショナリ・タイプを転送します。

response = JsonResponse([1, 2, 3], safe=False)

"

オリジナル:http://blog.gqylpy.com/gqy/262

おすすめ

転載: www.cnblogs.com/gqy02/p/11367312.html