首页 Python正文

找到你的路。python web框架 Django URLconf路由控制系统如何配置。Django处理浏览器web请求流程

sanrenxing Python 2022-03-24 582 0 | 文章出自:https://mp.weixin.qq.com/s?__biz=MzI5OTAwNjMzMg==&mid=2694958737&idx=1&sn=5af8f2d9dbbac3c9be471aebb665bc1a&chksm=c9c84e82febfc794dfb143b942d94d43ee5275e5aa52f17b819fcc1de70a73c50346255abe04&token=1794661324&lang=zh_CN#rd Django URLconf路由配置

Django URLconf路由配置

Django如何处理http请求

    聊URLCONF路由配置之前,先科普下Django是如何http请求的,印证下URL路由有多么重要。

    用户请求一个页面时,Django根据下面的逻辑执行操作:

    1、加载根URLconf模块,支持自定义。通常情况下,根据settings.py文件中ROOT_URLCONF 参数对应的值决定要使用的根URLconf模块。但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置),则其值将被用于代替ROOT_URLCONF设置。

    2、加载该模块并寻找可用的urlpatterns,它是django.urls.path()或者django.urls.re_path()实例的一个列表。

    3、依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。

    4、导入并调用匹配行中给定的视图,该视图可以是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数:

     一个HttpRequest 实例。

    如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。

    关键字参数由表达式匹配的命名组组成,但是可以被django.urls.path()的可选参数kwargs覆盖。

    如果没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图,如403、无任何反应等。

URLconf路由配置

    URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。

    URL路由在Django项目中的体现就是urls.py文件,这个文件可以有很多个,但绝对不会在同一目录下。新建Django项目,默认会在project_name/目录下创建一个urls.py文件,这就是项目的根URL。创建应用程序时默认不会创建,需要的时候自主创建,文件名和内容格式同项目url一致。最简单有效的方法就是直接把项目urls.py文件拷贝至当前应用目录下。

    划重点:Django项目的urls.py中针对每个应用分别配置不同的url路径,不同应用的url路径在各自的配置文件中分别配置。

举个栗子

    啰啰嗦嗦这么多,现在我们举个栗子验证说明下。分别在pools应用目录下的urls.py和views.py文件增加如下内容。

    urls.py

from django.urls import path
from . import views
urlpatterns=[
        path('', views.index, name='index'),
        # ex: /pools/5/
        path('<int:question_id>/', views.detail, name='detail'),
        # ex: /pools/5/results/
        path('<int:question_id>/results/', views.results, name='results'),
        # ex: /pools/5/vote/
        path('<int:question_id>/vote/', views.vote, name='vote'),
]

    views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ', '.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)
def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)
def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

    在浏览器中查看“/pools/1/”。Django 将加载mysite.urlsPython 模块,因为它是由设置指向的 ROOT_URLCONF。它找到命名的变量urlpatterns 并按顺序遍历模式。在 找到匹配项后'pools/',它会删除匹配文本 ( "pools/") 并将剩余文本 - "1/"- 发送到“pools.urls”URLconf 以进行进一步处理。在那里它匹配'<int:question_id>/',导致对detail()视图的调用如下:

    detail(request=<HttpRequest object>, question_id=1)

    该question_id=1部分来自<int:question_id>. 使用尖括号“捕获”部分 URL 并将其作为关键字参数发送到视图函数。字符串的question_id一部分定义了将用于识别匹配模式的名称,该int部分是一个转换器,用于确定哪些模式应该与这部分 URL 路径匹配。冒号 ( :) 分隔转换器和模式名称。


版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论