zoukankan      html  css  js  c++  java
  • Django学习日记06_视图_URLconf、View

    URLconf

    Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRequst中没有urlconf属性的话,便会访问该默认值。

    在urlconf中,设定了一组pattern:

    urlpatterns = [
        url(r'^admin/', include(admin.site.urls)),
    ]

    可以往该列表中添加需要的url函数,每个url函数包含两个参数:匹配模式、实现的view对象。

    NewImage

    url函数有两种调用方式:

    1. 对于view是一个视图对象时,直接返回RegexURLPattern(reggae, view, kwargs, name)对象,此时,将会使用mysite.settings中的ROOT_URLCONF值指定的默认URLconf,默认为mysite.urls;

    2. 对于view包含urlconf以及app name时,在使用时如一开始给出的例子一样,使用include一个URLconf的方式,如将/my_app/目录下的匹配规则放到my_app_patterns的URLconf中,然后在默认URLconf中添加:url(r’^my_app/$’,include(my_app_patterns)),对/my_app/下的内容进行匹配操作。这样的工作会让整个URL结构变得清晰。include同时可以将app_name、namespace包含在内形成一个三元素元组,通过命名空间来限定多个同名的视图对象。

    并且可以看到Django将会在未来版本中移除view使用字符串,同时prefix参数也将不再有用。

    kwargs参数指定view中需要调用的一些字典参数;

    设置name参数,可以在模板中使用url 来插入一个超链接,但是你必须保证名字的唯一性,否则模板中可能会插入另一个同名连接;

    namespaces,早期的Django版本在模板渲染时,Context、RequestContext对象必须设置current_app属性,而在复杂部署的应用中,设置current_app也是必要的。如果不同的应用使用同一套URLconf,那么通过include指定命名空间则可以区分这些同名应用:

    from django.conf.urls import include, url
    urlpatterns = [
        url(r'^author-polls/', include('polls.urls', namespace='author-polls', app_name='polls')),
        url(r'^publisher-polls/', include('polls.urls', namespace='publisher-polls', app_name='polls')),
    ]

    app_name指定了应用的名称,例如,在polls.urls中,有一个url的name为list,则其全名应该为polls:list,而完整路径为author-polls:polls:list,namespace指定了从哪个命名空间而来,app_name指定了以什么名字作为当前命名空间目录的名字。

    关于url的命名空间,详细参考djangodocument说明

    URLpattern

    url函数的第一个参数为一个匹配模式,和正则表达式基本相同,同时有一些自身的特点。

    1. 使用真实字符串来匹配,会省去很多转义的麻烦: r'  '

    2. 开头的斜杠省略不写,如匹配 /my_app/ : r'^my_app/$'

    3. 匹配时按照顺序匹配,匹配成功则直接调用

    4. Django偏好使用斜杠结尾,如果不以斜杠结尾导致不能匹配,将会被重定向至尾部以斜杠结尾的相同字眼的URL,可以通过配置文件中的APPEND_SLASH控制

    5. 保留大多数正则表达式规则

    6. 可以对匹配进行捕获,并且捕获的内容作为参数传入到view对象中,如果简单捕获,则传入参数时按照捕获的顺序,按照位置传入

    7. 通过?P<name> 可以对捕获的内容进行命名,命名后的捕获内容将会以字典参数的方式传入到view对象中,同在url调用时输入kwargs参数

    8. 应该使用?: 来取消捕获一些需要分组的、但是不必要传入到view对象中的内容,以免保持业务逻辑的简明

    View

    视图通过接受以及响应请求来实现网站的业务逻辑,django中的视图函数,即 view.py,即是一个接受网页请求并且做出网页响应的函数。

    view可以在任何地方实现,只要保证在PYTHONPATH中,能够被适当的命名空间寻找到,并且被URLconf与URL关联起来:

    from django.http import HttpResponse
    import datetime
    def current_datetime(request,*argv,**kw):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)

    current_datetime就是一个视图函数,该函数对request请求响应html页面。每一个视图函数都必须返回一个HttpResponse类或者其子类的实例。

    而在实际操作中,应该使用模板而避免将html直接硬编码到视图中。

    每个视图函数都是以一个HttpRequest对象作为第一个参数,后面可以跟一些基于位置的参数,匹配URL时将会把捕获到的内容按顺序传入,或者是字典参数,匹配URL时通过命名的捕获会传入到其中。

    需要注意的是,捕获到的内容都是字符串,就算是以(d)捕获的内容只会捕获到数字,但是捕获到的还是字符串,所以需要用合适的工厂函数加以转换类型。

  • 相关阅读:
    利用wget下载文件,并保存到指定目录
    tar命令详解
    Ubuntu 16.04中安装Chromium浏览器
    怎么打开unity tweak tool
    WPS for linux不能使用中文输入法
    Window7 驱动编程环境配置
    Windows内核 字符串基本操作
    Windows内核 语言选择注意点
    Windows内核 内存管理基本概念
    Windows内核 WDM驱动程序的基本结构和实例
  • 原文地址:https://www.cnblogs.com/lyon2014/p/4592775.html
Copyright © 2011-2022 走看看