基本的な3のDjangoのビュー関数
ビューDjangoのビュー関数
ビューと呼ばれるビュー機能(クラス)は、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(html)
のは、ラインによって上記のコード行を説明しましょう:
まず
django.http
、インポートモジュールのHttpResponse
クラスだけでなく、Pythonのdatetime
ライブラリ。その後、我々は定義
current_datetime
関数。これは、ビュー機能です。各ビューの機能を使用して、HttpRequest
最初のパラメータとしてオブジェクトを、そして一般的に知られていますrequest
。ビュー関数の名前は重要ではないことに注意してください。Djangoはそれを認識できるようにするために、名前を命名する統一されたアプローチを必要としません。我々はそれを名前を付けます
current_datetime
。この名前は、より正確にそれが実装する関数を反映することができますので、。このビューは返され
HttpResponse
、生成したレスポンスを含むオブジェクトを。各ビュー機能が戻るための責任があるHttpResponse
オブジェクトを。
Djangoは、システムを通過する要求と応答状態オブジェクトを使用します。
ブラウザがサーバーからページを要求すると、Djangoはリクエストのメタデータが含まれているのHttpRequestオブジェクトを作成します。その後、Djangoは適切なビュー、最初のパラメータとして機能するには、このビューのHttpRequestオブジェクトをロードします。
各ビューはHttpResponseオブジェクトを返すために責任があります。オブジェクト・リクエスト(リクエスト)および応答オブジェクト(のHttpResponse):ビュー層は、2つのオブジェクトを習得します
二CBVとFBV
FBV(関数ベースビュー)の閲覧要求の処理機能を使用することです。
FBVモードの前にコードで書かれているので、私は例を記述しないでください。
CBV(クラスベースビュー)の閲覧要求の処理に使用されます。
Pythonは唯一の機能を開発する場合は、オブジェクト指向逃し(継承、カプセル化、多型)の多くの利点があり、オブジェクト指向のプログラミング言語です。だから、Djangoは、後にクラスベースビューに参加しました。それは、私たちはビューを書き込むためにクラスを使用することができます。これの利点は、主に以下の二つです。
- コードの再利用性を改善する、オブジェクト指向技術は、ミックスイン(多重継承)として、使用することができます
- コードの可読性を向上させ、決定されていない場合、多くの中で、様々な異なる機能のHTTPメソッド用に処理することができます
我々は、治療のビューのGETメソッドを記述する場合は、以下のような関数を書きます。
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
あなたは、クラスベースのビューを作成する場合、それはこれです:
#类写法:
class LoginView(View):
def get(self,request):
print('get方法执行了')
return render(request,'login2.html')
def post(self,request):
username=request.POST.get('username')
password=request.POST.get('password')
print('post方法执行了')
print(username,password)
return HttpResponse('cg')
DjangoのリクエストURLはむしろクラスよりも、関数呼び出しに割り当てられています。この問題に対処するために、クラスベースビューが提供するas_view()
静的メソッド(すなわち、クラスメソッドである)、このメソッドを呼び出すと、クラスのインスタンスを作成し、次いで、実施例呼び出すことによってdispatch()
方法、dispatch()
この方法は、要求メソッドのそれぞれ異なる呼出方法に基づいて行われます処理要求(例えばget()
、post()
など)。ここで、メソッドとほぼ関数ベースのビューは、返された応答を得るために、リクエストを受信します。メソッドが定義されていない場合、例外がスローされますHttpResponseNotAllowed。
注意:CBVを使用する場合は、urls.pyにも対応する変更を行い::
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login2/$', LoginView.as_view()),
]
CBVのパラメータの受け渡し、FBV、など、知られているパケット、未知のパケット
URL執筆:不明なパケット
url(r'^cv/(\d{2})/', views.Myd.as_view(),name='cv'),
url(r'^cv/(?P<n>\d{2})/', views.Myd.as_view(name='xxx'),name='cv'),#如果想给类的name属性赋值,前提你的Myd类里面必须有name属性(类属性,定义init方法来接受属性行不通,但是可以自行研究一下,看看如何行通,意义不大),并且之前类里面的name属性的值会被覆盖掉
ミックスインを使用して、3つの(理解)
私は(以下、CBVと呼ばれる)、私たちが最初にはいジャンゴのCBVを導入するどのような目的を理解する必要があり、クラスベースビューのジャンゴを理解する必要性を感じています。django1.3前に、一般的なビューは、いわゆる汎用ビュー、関数ベースのビュー(FBV)の使用、すなわちビュー機能。一部の人々は、私は謙虚にそう信じて、CBVよりFBVがよりニシキヘビと思います。pythonの重要な特徴の一つは、オブジェクト指向です。CBVは、より良いPythonのオブジェクト指向を反映しています。CBVビューがクラスの方法の方法によって達成されます。クラスに対して機能は、多型のより具体的な使用は、それがマクロレベルでプログラム内のより一般的な機能から抽象化が容易です。多型ではなく、多くの説明については、興味のある学生には、Googleが所有しています。要するに、それは、フォーム(プロパティ)の様々なものとして理解することができます。CBVのDjangoのソースを見ることによって、原理は、それはその後の発送方法CBVの内部を通って分散CBVにルーティングされ、get要求は、CBV、分散POSTリクエストを分散処理方法をcbv.get一般urlで、容易に明らかです他の方法と同様の治療の.post方法。多型のどのように使用、それ?CBVは、ミックスインの概念を導入しました。ミックスインは、いくつかの基本的なクラスを書きと異なる組み合わせを介して最終的な所望のミックスインクラスなっています。
だから、理解CBVはミックスインを理解することに基づいています。Djangoのミックスインは、ビュークラスは、複数のミックスインを継承することができ、コードを再利用するために使用されるが、唯一の(ビューのサブクラスを含む)ビューを継承することができ、それは右端のビューを作成することが推奨され、ミックスインは左の詳細を記述します。
ビュープラスデコレータに四
デコレーターの装飾FBV
FBVは、関数自体であり、従って通常の関数デコレータ差なしに追加します。
from django.shortcuts import render, HttpResponse, redirect
def wrapper(f):
def innser(*args, **kwargs):
print('执行前')
ret = f(*args, **kwargs)
print('执行后')
return ret
return innser
@wrapper
def index(request):
print('12321')
return render(request, 'index.html')
デコレーターの装飾CBV
独立した機能が同一でないメソッドのクラスは、メソッドを直接デコレータクラスの関数に適用することができない、我々は最初の方法デコレータに変換する必要があります。
Djangoは方法デコレータデコレータに変換するmethod_decorator装飾的な機能を提供します。
def wrapper(f):
def innser(*args, **kwargs):
print('执行前')
ret = f(*args, **kwargs)
print('执行后')
return ret
return innser
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(wrapper,name='get')
class LoginView(View):
# 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。
# @method_decorator(wrapper)
def dispatch(self, request, *args, **kwargs):
# print('之前')
ret=super().dispatch(request, *args, **kwargs)
# print('之后')
return ret
# @method_decorator(wrapper)
def get(self,request):
print('get方法执行了')
return render(request,'login2.html')
# @method_decorator(wrapper)
def post(self,request):
username=request.POST.get('username')
password=request.POST.get('password')
print('post方法执行了')
print(username,password)
return HttpResponse('cg')
また、(最初の理解として)CBV時間にデコレータを追加します。
各機能が実行されるようにディスパッチは、内部の直接添加に
from django.utils.decorators import method_decorator @method_decorator(login_test) def dispatch(self, request, *args, **kwargs): res = super(IndexView, self).dispatch(request, *args, **kwargs) return res
各機能を追加
from django.utils.decorators import method_decorator @method_decorator(login_test) def get(self, request, *args, **kwargs): return render(request, 'index.html')
名前だけを取得するためにデコレータを追加することを示している背後に直接、クラスを追加
from django.utils.decorators import method_decorator @method_decorator(login_test, name='get')
メソッドをゲットするために追加されます(このパラメータの値は文字列でなければならないので、デコレーション法、書くための多層装飾的必要性、名前を複数追加したい場合は、このようにして、二つの方法を同時に書き込むことができません)
@method_decorator(login_test, name='post') post是给post方法加 class IndexView(View): def get(self,request): pass
あなたはデコレータを追加する前にdjango.utils.decoratorsインポートmethod_decoratorからインポートする必要があります
デコレータ関数名のために、)(@method_decoratorでなければならないブラケットをデコレータの形式を追加
クラス名に付加されて宣言する必要があります
CSRFトークンデコレータの特殊性に注意し、それが(後で)CBVは、上記ディスパッチ・モードを追加しただけです
ここでは、csrf_tokenデコレータです。
@csrf_protect、設定はcsrfTokenグローバルなミドルウェアを提供されていない場合でも、現在の関数のCSRF防止機能を余儀なくされました。
@csrf_exempt、グローバル設定は、ミドルウェアに設定されていても、現在の関数のCSRF防止機能を解除します。
注意:django.views.decorators.csrf輸入csrf_exemptから、csrf_protect
ファイブ要求は、オブジェクト公式文書を
( - HttpRequestのオブジェクト要求)要求に関連付けられたプロパティメソッド
def index(request): #http相关请求信息---封装--HttpRequest对象
if request.method == 'GET':
print(request.body) #获取post请求提交过来的原始数据
print(request.GET) #获取GET请求提交的数据
# print(request.META) # 请求头相关信息,就是一个大字典
print(request.path) #/index/ 路径
print(request.path_info) #/index/ 路径
print(request.get_full_path()) #/index/?username=dazhuang&password=123
return render(request,'index.html')
else:
print(request.body) # b'username=dazhuang'
print(request.POST) #获取POST请求提交的数据
return HttpResponse('男宾三位,拿好手牌!')
シックス・レスポンスオブジェクト
HttpRequestオブジェクトはジャンゴによって自動的に作成されると比較して、のHttpResponseオブジェクトが参照の我々の用語です。私たちは、それぞれのビューは、インスタンス化する必要が埋めるとのHttpResponseを返します書きます。
HttpResponse django.httpモジュールにあるクラス。
HttpResponse --- 回复字符串的时候来使用
render --- 回复一个html页面的时候使用
redirect -- 重定向
示例:
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'taibai' and password == 'dsb':
# return render(request,'home.html')
return redirect('/home/') #重定向
else:
return HttpResponse('滚犊子,赶紧去充钱!!!')
#首页
def home(request):
return render(request,'home.html')
HttpResponse.content:响应内容
HttpResponse.charset:响应内容的编码
HttpResponse.status_code:响应的状态码
リダイレクト():30Xステータスコードにブラウザ
パラメータを指定できます。
- モデル:モデルが呼び出される
get_absolute_url()
関数
2ビュー、パラメータを持っている可能性があります使用urlresolvers.reverse
逆にするには、名前を解決します
3.絶対または相対URLは、リダイレクト先として無傷のままであろう。
デフォルトでは、一時的なリダイレクトを返し、提供permanent=True
返します恒久的なリダイレクトを。
例:
あなたは方法のさまざまな使用することができるredirect()
機能を。
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'anwen@123' and password == '123':
return redirect('/app01/home/') ##重定向到/app01/home/路径,这也是发送了一个请求,别忘了在上面引入这个redirect类,和render、Httpresponse在一个地方引入
else:
return HttpResponse('登录失败!')
def home(request):
return render(request, 'home.html')
#app01里的 urls.py
from django.conf.urls import url
from app01 import views
urlpatterns=[
url(r'^$',views.login),
url(r'^home/',views.home),
]
良い仕事上のいくつかのファイルの後、私たちは、Djangoプロジェクトを再起動し、ランディングページのURLを入力して、あなたはポートとポートを入力したURLは、あなたがDjangoのようなプロジェクトを開始することに注意してください。
2つの要求、1はログイン要求、要求の指標である:|送信ボタンをクリックすると、あなたはいくつかの要求を送信したネットワークを見てください。|
さらに読書:**キーを2回301及び302に対し、要求されました:
1)301和302的区别。
301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取
(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301
2)重定向原因:
(1)网站调整(如改变网页目录结构);
(2)网页被移到一个新地址;
(3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的
网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。
A页面临时重定向到B页面,那搜索引擎收录的就是A页面。
A页面永久重定向到B页面,那搜索引擎收录的就是B页面。
用redirect可以解释APPEND_SLASH的用法!