zoukankan      html  css  js  c++  java
  • django之路由层

    1:url分发简介:

      当客户端(不仅仅是浏览器)向服务器发送请求的时候,有如下几个: 

      协议:计算机的双方的通信规则

      域名:我们知道要访问一个计算机,就必须知道要访问的计算机的ip地址。比如我们调试常用的 http://localhost:8000/   localhost===127.0.0.1就是ip地址,而域名通过域名解析就可以和IP地址形成多对一的关系,即一个域名只能对应一个IP地址,一个IP地址可以对应多个域名。注意每一个计算机IP地址是唯一的,域名只会解析IP地址,不会携带IP端口号,我们常见的域名不携带地址,因为不写端口,默认为80的端口

      路径:通过ip可以定位需要访问的计算机,通过端口号可以定位要访问到该计算机上真正运行的程序。而路径则可以定位需要访问该程序那个视图函数,视图函数通过逻辑处理,响应对应的资源给客户端

      参数:请求携带的参数,请求常见的有get和post的请求。get的请求参数写在地址栏被用户可见,?后是请求携带的参数,参数之间用&拼接。post的请求参数,存在请求体对用户不可见,可通过浏览器检查元素查看。

    2:djang简单的路由配置:  

    """blog URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.1/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.views.static import serve
    from django.contrib import admin
    from django.urls import path,re_path
    from app01 import views
    from blog import settings
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/',views.login),   # 访问对应的视图函数  views.login   访问 views模块中的login函数
        re_path(r'^$',views.index),
        re_path(r'index/',views.index),
        re_path(r'get_code/',views.Create_code),
        re_path(r'regester/',views.regester),
        re_path(r'^logout/$',views.logout),
        re_path(r'^media/(?P<path>.*)$', serve, {'document_root':settings.MEDIA_ROOT}),# 配置media
        re_path(r'^blog/(?P<username>w+)/$',views.blog),# 传参数配置 username参数名
        re_path(r'^blog/(?P<username>w+)/(?P<cat>tag|category|archive)/(?P<name>.*)/$',views.blog),
    ]
    View Code

    2.1: FBV和 CBV

           FBV:函数中使用视图函数

       CBV:类中使用视图函数

       CBV需要注意以下几点:

        一:视图类必须继承 View 类
        二:地址也需要调用 as_view 方法 # views.IndexView.as_view()
        
    from django.shortcuts import render
    
    from django.views import View
    # Create your views here.
    import time
    
    
    """
       FBV 和 CBV  (function base views  and  class base view)
       fbv  函数中使用视图函数
       cbv  类中使用视图函数
    
       在 CBV中 需要注意以下几点
        一:视图类必须继承 View 类
        二:地址也需要调用 as_view 方法   # views.IndexView.as_view()
    
        使用方式
          get 请求 会触发 get方法
          post请求 会触发 post 方法
          但是在执行所有的方法前,均会执行 dispatch  来确定分发的方法
    """
    
    
    # 继承 from  django.views import View
    
    class AuthView(View):
        def dispatch(self, request, *args, **kwargs):
            if not request.session.get('userInfo'):  # 获取session 
                return render(request, 'login.html')
            else:
                res = super(AuthView, self).dispatch(request, *args, **kwargs)  # 继承父类的分发请求的方法
                return res
    
    
    class IndexView(AuthView):  # 每一个需要进行  登录验证的 继承AuthView 类即可。使用多继承也可以
    
        def get(self, request, *args, **kwargs):
            times = time.time()
            return render(request, 'index.html', {'times': times})
    
        def post(self, request, *args, **kwargs):
            times = time.time()
            return render(request, 'index.html', {'times': times})
    View Code

    3:反向解析    

          3.1:反向解析的作用

       我们在页面或者视图函数中进行页面重定向或者页面转发的时候,习惯把路径直接写入。这样会出现一个问题,如果我们有需求需要对原有的路由地址进行修改的时候(当然我认为尽量不要修改),修改完路由地址后,原来使用原地址的函数或者页面,都需要修改成新的地址,这个时候如果有地址也有地址变量多好,引用处引用地址变量名,修改地址对引用出没有任何影响。反向解析地址就是通过,给路径取一个别名,再通过别名反向解析找到对应的实际路由路径。

      url配置 

      urlpatterns = [
      re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    ] 

      视图函数上使用

      from django.urls import reverse    # 反向解析
      from django.http import HttpResponseRedirect
    
      def redirect_to_year(request):
      year = 2006
      return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) # 同redirect("/path/",{'year':year})

          模版上使用

      <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    
      <ul>
        {% for yearvar in year %}
        <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
        {% endfor %}
      </ul>

    4:名称空间

      

    命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。 由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回 我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

    project的urls.py:

    urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^app01/', include("app01.urls",namespace="app01")),
    re_path(r'^app02/', include("app02.urls",namespace="app02")),
    ]

    app01.urls:

    urlpatterns = [
    re_path(r'^index/', index,name="index"),
    ]

    app02.urls:

    urlpatterns = [
    re_path(r'^index/', index,name="index"),
    ]

    app01.views

    from django.core.urlresolvers import reverse
    def index(request):
    return HttpResponse(reverse("app01:index"))

    app02.views

    from django.core.urlresolvers import reverse
    def index(request):
    return HttpResponse(reverse("app02:index"))
  • 相关阅读:
    sql日期操作
    用户活跃状态模型
    R基于Bayes理论实现中文人员特性的性别判定
    python的一点小常识
    [工作技能]SVN
    北大计算所词性标注集简表
    c++ boost 汉字和模式串混用的例子
    SVN文本文件报二进制属性的问题
    我的R代码备份
    FaceBook Twitter实习生简历求内推
  • 原文地址:https://www.cnblogs.com/yingjp/p/10086434.html
Copyright © 2011-2022 走看看