zoukankan      html  css  js  c++  java
  • Django之views

    一.路由配置系统

    1.1 基本认识

      a. URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表

      b. URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。

    例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/

    在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/

    URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POSTGETHEAD等等 —— 都将路由到相同的函数。

      c. 每个捕获的参数都作为一个普通的Python 字符串传递给视图,无论正则表达式使用的是什么匹配方式。

    1.2 语法

    urlpatterns = [
             url(正则表达式, views视图函数,参数,别名)
    

    1.3 基本用法

    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'^login/$', views.login),              #加$,完整匹配
    #加括号,将作为位置参数传入view函数里
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^menu/(d+)', views.menu), # menu(request,1)
    '''
    有名分组(named group)
    将用"()"捕获的URL中的值以关键字参数传入view函数中
    在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
    '''
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
    ]
    '''
    利用有名分组,给view参数设默认值
    '''
    
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^blog/$', views.page),
        url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
    ]

    1.4 URL分发

    '''
    当有多个app,且url路径较多时,为方便管理,可进行url分发
    在app目录中建立自己的urls,在共享urls文件中利用‘include’实现
    '''
    from django.conf.urls import include, url
    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^blog/', include('blog.urls')),
    ]

    另一种分发:

    url的第二个参数也可以直接进行分发,语法:

    url(r'xxx',([url(r'yyy',views)],None,None))
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^stark/', ([
                             url(r'app01/userinfo/', ([
                                                          url(r'add', add),
                                                          url(r'delete', delete),
                                                      ], None, None)),
                             url(r'app01/book/', ([
                                                      url(r'add', add)
                                                  ], None, None))
                         ], None, None))

    1.5 URL反向解析

      在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。

    人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

    换句话讲,需要的是一个DRY 机制。除了其它有点,它还允许设计的URL 可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。

    获取一个URL 最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL 的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。

    Django 提供一个办法是让URL 映射是URL 设计唯一的地方。你填充你的URLconf,然后可以双向使用它:

    • 根据用户/浏览器发起的URL 请求,它调用正确的Django 视图,并从URL 中提取它的参数需要的值。
    • 根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。

    第一种方式是我们在前面的章节中一直讨论的用法。第二种方式叫做反向解析URL、反向URL 匹配、反向URL 查询或者简单的URL 反查。

    在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

    • 在模板中:使用url 模板标签。
    • 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
    • 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法
    #urls中
    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'^loginggggg/$', views.login,name='login'),
    
    #templates中
    <form action="{% url 'login' %}" method="post">

    1.6 名称空间(namespace)

    二.视图函数(views)

    2.1 介绍

      接受web请求并进行逻辑处理继而返回web响应。

      约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

    2.2 请求对象

    request作为views函数中的第一个参数使用

    Request.body
    '''
    一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
      但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
      另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。
    '''
    
    Request.path
    '''
    一个字符串,表示请求的路径组件(不含域名)。
      例如:"/music/bands/the_beatles/"
    '''
    
    Request.method
    '''
    一个字符串,表示请求使用的HTTP 方法。必须使用大写。
      例如:"GET"、"POST"
    '''
    
    Request.GET
    '''
    一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
    '''
    
    Request.POST
    '''
      一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
      POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
       因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;应该使用 if request.method == "POST" 
      另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
    '''
    
    Request.META
    '''
       一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
        CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
        CONTENT_TYPE —— 请求的正文的MIME 类型。
        HTTP_ACCEPT —— 响应可接收的Content-Type。
        HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
        HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
        HTTP_HOST —— 客服端发送的HTTP Host 头部。
        HTTP_REFERER —— Referring 页面。
        HTTP_USER_AGENT —— 客户端的user-agent 字符串。
        QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
        REMOTE_ADDR —— 客户端的IP 地址。
        REMOTE_HOST —— 客户端的主机名。
        REMOTE_USER —— 服务器认证后的用户。
        REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
        SERVER_NAME —— 服务器的主机名。
        SERVER_PORT —— 服务器的端口(是一个字符串)。
       从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
        都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
        所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
    '''

    2.3 render

      结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

    render(request, template_name,{})

    template_name:模板名称

    {}:可选,对html文件进行渲染。具体见Django之templetes

    return render(request,'dep_change.html',{'dep_init_name':dep_init_name})
    return render(request,'dep_change.html',locals())      #不需一个一个传值

      

    2.4 redirect

    重定向。参数为一个url地址。

  • 相关阅读:
    VS 2010 C#入门操作小技巧
    spring-data-jpa 多数据源
    Spring--3.Spring的单元测试
    Spring--5.IOC总结
    Spring--4.实验23.IOC容器的测试泛型依赖注入*
    Spring--2.Spring之IOC--IOC容器的22个实验(3)
    Spring--2.Spring之IOC--IOC容器的22个实验(2)
    Spring--2.Spring之IOC--IOC容器的22个实验(1)
    Spring--2.Spring之IOC--了解IOC容器
    Spring--1.了解Spring
  • 原文地址:https://www.cnblogs.com/hantaozi430/p/8350514.html
Copyright © 2011-2022 走看看