澳门在线威尼斯官方 > 澳门在线威尼斯官方 > django中url路由配置及渲染方式

原标题:django中url路由配置及渲染方式

浏览次数:71 时间:2019-10-22

  网络通讯的本质是socket,从socket封装到MVC模式,参见另外几篇博客。本节笔记整理自Django2.0官方文档。

  今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。

一、url调度器 - django.urls.path

  django2.0中使用path函数替代url函数。path函数源码如下:

def _path(route, view, kwargs=None, name=None, Pattern=None):
    if isinstance(view, (list, tuple)):
        # For include(...) processing.
        pattern = Pattern(route, is_endpoint=False)
        urlconf_module, app_name, namespace = view
        return URLResolver(
            pattern,
            urlconf_module,
            kwargs,
            app_name=app_name,
            namespace=namespace,
        )
    elif callable(view):
        pattern = Pattern(route, name=name, is_endpoint=True)
        return URLPattern(pattern, view, kwargs, name)
    else:
        raise TypeError('view must be a callable or a list/tuple in the case of include().')

path = partial(_path, Pattern=RoutePattern)  # functools.partial
re_path = partial(_path, Pattern=RegexPattern)

  path函数接收四个参数:route,view,kwargs和name。它用functools.partial装饰了一下,将路由处理类RoutePattern作为参数传递给了Pattern。

  • 创建视图函数并访问
  • 创建app
  • django中url规则
  • 捕获参数
  • 路径转换器
  • 正则表达式
  • 额外参数
  • 渲染方式

  1、path函数的参数[route,view,kwargs,name]

urlpatterns = [
    path('homePage', views.homePage),
    path('userInfo', views.userInfo, name='userInfo'),
    path('blog', views.blog, name='logout', kwargs={'id':10})
]

  route指定url匹配规则并可以从url中获取参数,view返回一个视图函数或者一个url列表(元组),name主要使模板和url解耦,kwargs为视图函数设置参数。


  2、route匹配和获取url参数

  path函数默认使用RoutePattern来匹配url,并从中获取相应参数,该参数需要在视图函数中设置同名形参来接收。

# app01/urls.py
from django.urls import path
from app01 import views
urlpatterns = [
    path('items/<name>/<int:id>', views.items_handler),
]
# app01/views.py
from django.shortcuts import HttpResponse

def items_handler(request, name, id):
    return HttpResponse("{}, {}".format(name, id))

  route可以使用"<val>"获取指定的字符串,甚至可以使用"<type: val>"的方式指定获取的数据类型,参数val需要被接收。

  path函数支持str、int、path、slug、uuid等数据类型。str匹配不包含路径分隔符"/"的非空字符串,path匹配包含路径分隔符"/"的非空字符串,int包含有效的整数。

  也可以自定义数据类型:

from django.urls import path, register_converter
from . import converters, views

class FourDigitYearConverter:
    regex = '[0-9]{4}'
    def to_python(self, value):
        return int(value)
    def to_url(self, value):
        return '%04d' % value
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<yyyy:year>/', views.year_archive),
    ...
]

  re_path则用正则表达式来匹配url和截取参数。例如:

# urls.py
from django.urls import path, re_path
from . import views
urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[w-]+)/$', views.article_detail),
]

# views.py
from django.shortcuts import HttpResponse

def year_archive(request, year):
    return HttpResponse(year)
def month_archive(request, year, month, name):return HttpResponse("%r, %r" % (year, month))
def article_detail(request, year, month, slug, name):return HttpResponse("%r, %r, %r" % (year, month, slug))

创建视图并访问

  项目中自带的Python文件中,并没有带有视图,因此我们自己创建一个,通常,我们把视图命名views.py。

  然后在views.py中,导入头文件

   from django.http import HttpResponse

  然后我们在views.py中,写一些Python函数,用来访问

    def hello:                          /*request用户的请求 */            return HttpResponse(‘hello,欢迎来到django’)

 

 在url.py中为视图函数配置路由

  

from django.urls import pathfrom .  import viewsurlpatterns = [    path('hello',hello),       ]

 

  运行项目,如果上传方式是Ctrl+S的话,记得上传之后再运行,成功后

  浏览器输入 127.0.0.1:8000/hello 即可访问到


  3、view参数

  path源码可以接收的view参数包括: 函数,被URLPattern处理;列表或元组,被URLResolver。view参数也有两个功能,调用视图函数并传递给其参数,以及拆包。

from django.urls import include, path
# 方法一:分别导入属视图函数和urlpatterns(extra_patterns),在urls.py中使用include()函数组合起来from credit import views as credit_views
extra_patterns = [
    path('reports/', credit_views.report),
    path('reports/<int:id>/', credit_views.report),
    path('charge/', credit_views.charge),
]
urlpatterns = [
    path('help/', include('apps.urls')),  # 方法二:直接将urlpatterns写在应用下(apps/urls.py),urls.py中用include导入apps/urls.py即可
    path('credit/', include(extra_patterns)),
]

  来看一下include源码:

def include(arg, namespace=None):
    app_name = None
    if isinstance(arg, tuple):
        # Callable returning a namespace hint.
        try:
            urlconf_module, app_name = arg
        except ValueError:
            if namespace:
                raise ImproperlyConfigured(
                    'Cannot override the namespace for a dynamic module that '
                    'provides a namespace.'
                )
            raise ImproperlyConfigured(
                'Passing a %d-tuple to include() is not supported. Pass a '
                '2-tuple containing the list of patterns and app_name, and '
                'provide the namespace argument to include() instead.' % len(arg)
            )
    else:
        # No namespace hint - use manually provided namespace.
        urlconf_module = arg

    if isinstance(urlconf_module, str):
        urlconf_module = import_module(urlconf_module)
    patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
    app_name = getattr(urlconf_module, 'app_name', app_name)
    if namespace and not app_name:
        raise ImproperlyConfigured(
            'Specifying a namespace in include() without providing an app_name '
            'is not supported. Set the app_name attribute in the included '
            'module, or pass a 2-tuple containing the list of patterns and '
            'app_name instead.',
        )
    namespace = namespace or app_name
    # Make sure the patterns can be iterated through (without this, some
    # testcases will break).
    if isinstance(patterns, (list, tuple)):
        for url_pattern in patterns:
            pattern = getattr(url_pattern, 'pattern', None)
            if isinstance(pattern, LocalePrefixPattern):
                raise ImproperlyConfigured(
                    'Using i18n_patterns in an included URLconf is not allowed.'
                )
    return (urlconf_module, app_name, namespace)

创建app

  创建APP的方式不只一种,在虚拟机里可以创建,也可以在pycharm里创建

澳门在线威尼斯官方 ,  命令为:Python manage.py startapp appname

  在虚拟机里创建完,要在pycharm中下载下来

在pycharm中创建:

方式一:

  项目运行成功后,在terminal里面找到本项目,输入命令 Python manage.py startapp appname

澳门在线威尼斯官方 1

  如果没有连接本地,则需要重新连接

澳门在线威尼斯官方 2

  方式二:

    tool ----> run manage.py projectname

澳门在线威尼斯官方 3

澳门在线威尼斯官方 4  

  startapp appname

  此方法也需要下载下来

澳门在线威尼斯官方 5

澳门在线威尼斯官方 6

下载完成后,创建的app就出现了。


  它可以传入文件路径字符串或者一个包含多个元组的列表(触发else:urlconf_module

arg),并使用importlib.import_module导入文件,也可以传递一个当一个请求进来时,通过反射调用相应的视图函数(pattern = getattr(url_pattern, 'pattern', None))。

url规则

  4、path参数类型和作用域

  path函数的参数分为三种:kwargs、route和request。尽管request不属于path,这里为了比较姑且这样写。

  kwargs参数作用域最大,不仅涉及include的所有子路由,而且涉及所有能被route捕捉和匹配的当前路由。kwargs设定的参数需要属兔函数设置同名形参来接收。一般用于后台设置。

# urls.py
from django.contrib import admin
from django.urls import re_path, path, include
from app01 import views
extra_pattern = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[w-]+)/$', views.article_detail),
]
urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include(extra_pattern), {"name": "Jan"}),
    # path('app01/', include('app01.urls'))
]

# app01/views.py
from django.shortcuts import HttpResponse
# 每一个子路由对应的视图函数都要声明name参数
def year_archive(request, year, name):
    return HttpResponse("{}, {}".format(year, name))
def month_archive(request, year, month, name):
    print(name)
    return HttpResponse("%r, %r" % (year, month))
def article_detail(request, year, month, slug, name):
    print(name)
    return HttpResponse("%r, %r, %r" % (year, month, slug))

  route参数是匹配符合规则的url,并从url中获取参数。它的作用域为这些符合规则的url,并且只影响一个视图函数。

  kwargs和route所设置的参数,都是需要视图函数声明。request参数可以接收GET和POST请求,它需要在视图函数中作为第一个参数声明。request在url之前已经封装好了。

1、网址组成

    网址:全球统一资源定位符

    

    这是本文网址,做个栗子吧

    

    协议 域名 路径 参数

    django只搜索路径部分,与其他都无关

 二、视图函数

2、django的路由系统

    当一个请求来到

    1、首先到项目目录下,url.py里查找路由规则

    2、跟urlconf模块,里面定义了urlpatterns变量

    3、按顺序运行每一个,到第一个匹配的模式停止

    4、一旦匹配,django导入并调用给定的视图

    5、如果没有匹配到,或者中间出错,则返回404

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:django中url路由配置及渲染方式

关键词:

上一篇:Python基础定义

下一篇:没有了