ルーティングコントローラー
参考リンク:Djangoソースコード読解:ルーティング(2) - Zhihu
ルート ルーティングはマッピング関係です。ルーティングは、クライアントによって要求された URL パスをビューにバインドしてマップする 関係です。
この /timer は、ルーティング コントローラーを介して、最終的に myapp.views のビュー関数タイマーと照合されます。
Django のすべてのルートは最終的に変数に保存されurlpatterns
、url パターンはメイン アプリケーションのurls.pyの合計ルートで宣言する必要があります。これは構成ファイルの設定によって設定されます。
Django の実行中にクライアントが http リクエストをサーバーに送信すると、サーバーの Web サーバーは http プロトコルから URL アドレスを抽出し、プログラム内からプロジェクト内の URL パターンに追加されたすべてのルーティング情報の URL を検索します。トラバーサルマッチング用。それらが等しいか、一致が成功した場合、現在の URL オブジェクトの view メソッドが呼び出されます。
urlpatterns ルート リストにルートを追加するプロセスで、Django は開発者がルートを登録するための、文字列ルーティングと通常のルーティングの合計 2 つの関数を提供します。
from django.urls import path # 字符串路由
from django.urls import re_path # 正则路由,会把url地址看成一个正则模式与客户端的请求url地址进行正则匹配
# path和re_path 使用参数一致.仅仅在url参数和接收参数时写法不一样
1.1 基本的な使い方
path と re_path の 2 つのルートの使用:
# 只要请求路径和正则匹配成功就会执行视图函数~
path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$', views.year_archive),# $ 符 不会被上面的覆盖掉 上面的就匹配不成功了
# 1、简单分组 ([0-9]{4}) ([0-9]{2}) 是按位置传参的 和参数位置有关
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),#加个小括号是正则的简单分组 符合小括号的正则内容 会按形参入到视图函数中 函数也要接收~
# 2、有名分组 ?P<year> ?P<month> 是按关键字传参的 和参数位置无关 视图函数形参的参数名要保持一直
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive2),
'''
re_path(r'^articles/(\d{4}/(\d{1,2})/$',articles_archive_by_month)
请求路径:/articles/2010/12
# 简单分组
re.findall("articles/(\d{4}/(\d{1,2})","/articles/2010/12") # 左边是规则 后面是请求路径
一旦匹配成功:调用articles_archive_by_month(request,2010,12) # (\d{4}/(\d{1,2})分组了 就会传参 视图函数就会在数据库里进行查询
# 有名分组
一旦匹配成功:
if 简单分组:
调用articles_archive_by_month(request,2010,12) # 位置传参
else if 有名分组:
调用articles_archive_by_month(request,year = 2010,month = 12) # 关键字传参
'''
1.2 ルート分配
from django.urls import path, re_path, include
path('api/', include('erp_system.urls')),
path('api/', include('basic_info.urls')),
path('api/', include('goods_info.urls')),
path('api/', include('purchase_info.urls')),
path('api/', include('warehouse_info.urls')),
1.3 逆分析
Django プロジェクトを操作する場合、一般的なニーズは、生成されたコンテンツ (ビューやユーザーに表示される URL など) への埋め込み、またはサーバー側のナビゲーション (リダイレクトなど) の処理のいずれかのために、URL の最終形式を取得することです。)。これらの URL (手間がかかり、拡張性がなく、エラーが発生しやすい) をハードコードしたり、URLconf とは関係のない特殊な URL 生成メカニズムを設計したりしないことが強く望まれています。これは、ある程度の URL が古くなりやすいためです。
逆分析:死に至るルートは書きたくない
URL が必要な場合、Django はさまざまなレベルで URL 反転のためのさまざまなツールを提供します。
テンプレート内: URL テンプレートタグを使用します
Python コードの場合: from django.urls import reverse関数を使用します。(ビュー関数リダイレクトにURLを記述する場合)
urls.py で URL のエイリアス パラメータを設定します。
from django.conf.urls import url
from . import views
urlpatterns = [
#...name='news-year-archive'
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]
テンプレートに逆解析を適用します: {% url 'news-year-archive' 2012 %}エイリアス: 'news-year-archive' 通常のパラメーター: 2012。
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<a href="/articles/2012/">2012 Archive</a>
from django.shortcuts import redirect
from django.urls import reverse
def redirect_to_year(request):
year = 2006
reverse_path=reverse('news-year-archive', args=(year,))
return redirect(reverse_path) # 等效 redirect("/articles/2006/")
2つのビュー
Django には、ビュー関数とビュー クラスという 2 つの主なタイプのビューがあります。ここでは、ビュー関数 (FBV) から始めて、次にビュー クラス (CBV) について学びます。
-
Function BaseView:関数ベースビュー
-
Class BaseView:クラスベースビュー
2.1 リクエスト方法
Web プロジェクトは http プロトコルで実行され、デフォルトでは、ユーザーがさまざまな http リクエストを介してデータを送信することを確実にサポートします。Django は、クライアントが指定された HTTP リクエストを通じてのみプロジェクト ビューにアクセスできるようにすることをサポートしています。
ホーム/views.py
# 让用户发送POST才能访问的内容
from django.views.decorators.http import require_http_methods
@require_http_methods(["POST"])
def login(request):
# 获取请求方式 GET/POST
print(request.method)
# 获取请求体数据
print(request.body) # 一个字符串,代表请求报文的请求体的原数据
print(request.POST) # 只有请求数据格式是 urlencoded 时才能获取到
# 获取具体数据
user = request.POST.get("user")# get()获取键对应值的列表里的最后一个元素
hobby = request.POST.getlist("hobby")# 获取值列表里的所有元素
return HttpResponse("登录成功!")
ルート バインディング、demo/urls.py
コード:
from django.contrib import admin
from django.urls import path
from home.views import timer
urlpatterns = [
path('admin/', admin.site.urls),
path("timer", timer),
path("login", login),
]
2.2 リクエストオブジェクト
Django は、リクエスト メッセージ内のリクエスト行、ヘッダー情報、コンテンツ本文を HttpRequest クラスの属性にカプセル化します。特に指定がない限り、その他はすべて読み取り専用です。
HttpRequestオブジェクトには、現在のリクエスト URL に関するいくつかの情報が含まれています。
# 进入注册页面的视图函数
@require_http_methods(["GET"])
def register(request):
print('进入register视图函数')
user_id = request.GET['id']
print(user_id, type(user_id))
return HttpResponse(f'你传入的用户ID是:{user_id}')
2.2.1 リクエスト方法
print(request.method)
2.2.2 リクエストデータ
1. HttpRequest.GET : HTTP GET のすべてのパラメータを含む辞書のようなオブジェクト。詳細については、QueryDict オブジェクトを参照してください。
2. HttpRequest.POST : 辞書のようなオブジェクトリクエストにフォーム データが含まれている場合、データは QueryDict オブジェクトにカプセル化されます。# 注: チェックボックス型の input タグ、select タグなど、キーと値のペアの値が複数の場合、 # request.POST.getlist("hobby") を使用する必要があります。
3. HttpRequest.body : リクエストメッセージのリクエストボディの元のデータを表す文字列。
2.2.3 リクエストパス
HttpRequest.path : リクエストのパスコンポーネント(getパラメータを除く)がパス部分のみであることを示します。
HttpRequest.get_full_path() : 取得パラメータを含むパス。
2.2.4 リクエストヘッダー
HttpRequest.META : すべての HTTP ヘッダーを含む標準の Python 辞書。特定のヘッダー情報はクライアントとサーバー、HttpRequest.META.get('HTTP_HOST') によって異なります。
2.3 応答オブジェクト
応答オブジェクトには主に 3 つの形式があります。
HttpResponse () # 応答基本クラス
JsonResponse () # json 形式の応答 (インターフェイス プログラミング、DRF)
render () # コアは HttpResponse()
redirect () # カーネルは HttpResponse()
2.3.1 HttpResponse()
クライアントからリクエストを受信した後、Django サーバーは送信されたデータを HttpRequest オブジェクトにカプセル化し、ビュー関数に渡します。次に、ビュー関数も、関連するロジックを処理した後、ブラウザーに応答を返す必要があります。
この応答の場合、HttpResponseBase のオブジェクトまたはそのサブクラスを返す必要があります。HttpResponse は、HttpResponseBase の最も一般的に使用されるサブクラスです。
return HttpResponse("登录成功!",status=404,content_type='text/plain')
共通のプロパティ:
content : 返されたコンテンツ。
status_code : 返された HTTP 応答ステータス コード。
content_type : 返されたデータの MIME タイプ。デフォルトは text/html です。ブラウザはこの属性に基づいてデータを表示します。text/htmlの場合は文字列が解析され、text/plainの場合はプレーンテキストが表示されます。
応答ヘッダーを設定します: response['X-Access-Token'] = 'xxxx' 。
2.3.1.2 JsonResponse クラス:
オブジェクトを json 文字列にダンプし、その json 文字列を返して Response オブジェクトにカプセル化してブラウザに返すために使用されます。そして、その Content-Type は application/json です。サンプルコードは次のとおりです。
from django.http import JsonResponse
def index(request):
book = {"title":"三国演义","price":199}
books = [{"title":"三国","price":99},{"title":"三国演义","price":199}]
# JsonResponse(book)本质 是先序列化json.jump, ensure_ascii=False 使数据正常显示 。content_type='application/json' 声明一下响应类型
# return HttpResponse(json.jump(book,ensure_ascii=False),content_type='application/json')
# return JsonResponse(book) # 默认是序列化一个字典
return JsonResponse(books,safe=False) # 序列化一个非字典数据(列表)
デフォルトでは、JsonResponse は辞書のみをダンプできます。辞書以外のデータをダンプしたい場合は、safe=False パラメータを JsonResponse に渡す必要があります。
2.3.2 render() レンダリング関数
render(request, template_name,[context])
#结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。\
render(request,'users/index.html',['ip':2013])
パラメータ:
/*
request: 用于生成响应的请求对象。ip
template_name:要使用的模板的完整名称,可选的参数。模板文件非html文件因为里面有模板语句{
{ip}},渲染后呈现在浏览器中的才是htm页面
context:添加到模板上下文的一个字典,
默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
*/
render メソッドは、テンプレート ページ内のテンプレート構文をレンダリングし、最後にそれを応答本文として HTML ページにレンダリングします。
2.3.3 リダイレクト方式(リダイレクト)
Django フレームワークを使用して Python Web アプリケーションを構築する場合、ある時点でリダイレクト メソッドを使用してユーザーをある URL から別の URL にリダイレクトする必要があります。
パラメータは次のとおりです。
-
絶対 URL または相対 URL。リダイレクトの場所として変更されずに使用されます。
-
URL のエイリアス: reverse を使用して URL を逆に解析できます
# 传递要重定向到的一个具体的网址
def my_view(request):
...
return redirect("/some/url/")
# 当然也可以是一个完整的网址
def my_view(request):
...
return redirect("http://www.baidu.com")
# 传递一个视图的名称
def my_view(request):
...
return redirect(reverse("url的别名"))
リダイレクトには 2 つのリクエストがあります。最初のリクエストは、レスポンス ヘッダーの場所:/index/ (/index/ はリダイレクトに書かれた相対パス) コード: 301 を返します。ブラウザが 301 または 302 を読み取る限り、リダイレクトが開始されます。新しいリクエスト。index.html ページを 2 回返します。
APPEND_SLASH の実装はリダイレクトに基づいており、デフォルトではブラウザのリクエスト パスは / で補完されます。設定ファイルで APPEND_SLASH=False を設定すると、デフォルトで補完がオフになります。
3 つのログイン認証ケース
3.1 HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
/*/users/auth 相对路径一定要加第一个/*/
<form action="/user/auth" method="post">
用户名<input type="text" name="user">
密码 <input type="password" name="pwd">
/*span标签提示错误信息*/
<input type="submit"> <span style="color: red">{
{ msg }}</span>
</form>
</body>
</html>
3.2 ルーティング構成
from django.contrib import admin
from django.urls import path, re_path,include
from users.views import login,auth
urlpatterns = [
path("login",login),
path("auth",auth),
]
3.3 ビュー機能
def login(request):
return render(request,"login.html")
def auth(request):
# 获取数据
print("request.POST:",request.POST)
user = request.POST.get("user")
pwd = request.POST.get("pwd")
# 模拟数据校验
if user == "laomao" and pwd == "123456":
# return HttpResponse("验证通过")
return redirect("/users/")
else:
# return HttpResponse("用户名或者密码错误")
# return redirect("/users/login")
# 重定向适合动态页面 静态页面可以用render
# 静态页面渲染一些信息一般用render
msg = "用户名或者密码错误"
return render(request,"login.html",{"msg":msg})