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"))
原文地址:https://www.cnblogs.com/yingjp/p/10086434.html