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), ]
2.1: FBV和 CBV
FBV:函数中使用视图函数
CBV:类中使用视图函数
CBV需要注意以下几点:
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})
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"))