Django URL路由

 
对于高质量的web应用来说,使用简洁,优雅的URL路由是一个值得尊重的细节,Django可以随心所欲的设计URL,不受框架的约束
为了给一个应用设计URL,你需要一个Python模块,通常被称为URLconf,这个模块是纯粹的URL模式(简单的正则表达式)到python函数(视图函数)的简单映射



Django如何处理一个请求
1.决定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置),
则其值将被用于代替ROOT_URLCONF设置。通俗的讲,就是你可以自定义项目入口url是哪个文件!

2.加载该模块并寻找可用的urlpatterns。 它是django.conf.urls.url()实例的一个列表。

3.依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。

4.导入并调用匹配行中给定的视图,该视图是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数:
(1)一个HttpRequest 实例。
(2)如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。
(3)关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。

5.如果没有匹配到正则表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。



URLconf
URLconf是一个python模块,是一个URL模式(简单的正则表达式)到python视图(函数或者类)之间的映射



urlpatterns
urlpatterns 是一个url()实例类型的python列表
urlpatterns 中的每个正则表达式在第一次访问他们时被编译



url函数
url(regex,view,kwargs=None,name=None)

regex:一个字符串(原始字符串)或简单的正则表达式
view:是一个视图函数(类)或者as_view()的结果
kwargs:传递额外的参数给视图
name:url名称


include 语法
include(module,namespace=None,app_name=None)
include(pattern_list)
include((pattern_list,app_namespace),namespace=None)
include((pattern_list,app_namespace,instance_namwespace))

module:URLconf模块
namespace:URL命名空间
app_name:app的命名空间
pattern_list:可迭代的djang.conf.urls.url()实例
app_namespace:应用名称空间
instance_namespace:实例的命名空间


include示例:

# 主urls.py
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
    url(r‘^dashboard/‘,include(‘dashboard.urls‘)),
    url(r‘^admin/‘,admin.site.urls)
]


# dashboard.urls配置文件
from django.conf.urls import url,include
from . import views
urlpatterns = [
    url(r‘^user/‘,include([
        url(r‘^list/$‘,view.userlist,name=‘user_list‘),
        url(r‘^info/$‘,view.userinfo,name=‘user_linfo‘),
        url(r‘^modify/‘,include([
             url(r‘status/$‘,view.modifystatus,name=‘modify_status‘)
        ]))
    ]))
]

# dashboard.views视图
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
    return HttpResponse(‘Index Page‘)

def userList(request):
    return HttpResponse("User List Page")

def userStatus(request):
    return HttpResponse("User Status Page")

def UserInfo(request):
    return HttpResponse("User Info Page")
    
    
# 请求方式
curl http://192.168.33.10:8080/dashboard/user/user_list/
curl http://192.168.33.10:8080/dashboard/user/modify/status/
curl http://192.168.33.10:8080/dashboard/user/modify/info/



url参数
若要从URL中捕获一个值,只需要在他周围放置一对圆括号

urlpatterns = [
    url(r‘^article/2003/$‘,views.special_case_2003,name=‘special_case_2003‘),
    url(r‘^article/(2004)/$‘,views.articleViewInfo,name=‘special_case_2003‘),
    url(r‘^user/([0-9]{4})/$‘,views.userInfo),
    url(r‘^date/([0-9]{4})/([0-9]{2})/([0-9]{2})$‘,views.dateInfo)
]


对应的视图函数

def special_case_2003(request):
    return HttpResponse("2003")

def articleViewInfo(request,*args,**kwargs):
    print(args)       #位置参数获取
    return HttpResponse(‘request2004‘)

def userInfo(request,*args,**kwargs):
    return HttpResponse(json.dumps(args))

def dateInfo(request,*args,**kwargs):
    data = {"year":args[0],"month":args[1],"day":args[2]}
    # return HttpResponse(json.dumps(data))
    return JsonResponse(data)
    
    
    
关键字参数
语法
(?P<name>pattern)

- name是传给视图参数的名字,
- pattern是一个正则表达式,也是关键字参数的值

实例:

url:
url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$‘,views.articleInfoView)



view视图函数
def articleInfoView(request,*args,**kwargs):
    return JsonResponse(kwargs)
    
请求方式:http://192.168.33.10:8080/dashboard/articles/2004/12/21/



url参数-额外参数
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数

url:
url(r‘users/(?P<name>[a-z]+)‘,views.users,{‘extra_args‘:‘hehehe‘})

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r‘^blog/(?P<year>[0-9]{4})/$‘, views.year_archive, {‘foo‘: ‘bar‘}),
]

请求地址:/blog/2005/
调用函数:views.year_archive(request, year=‘2005‘,foo=‘bar‘)



url反向解析
django给每个URL取了一个名字,存储每个URL与name的映射关系
根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。
这种方式叫做反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查

实例:

url:
from django.conf.urls import url
from . import views
urlpatterns = [
    url(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,)))

模板中使用:
<a href="{% url ‘news-year-artive‘ yearvar%}">{{ yaervar }}Archieve</a>



类视图
视图是一个可调用的对象,它接收一个请求然后返回一个响应,这个可调用对象可以不只是函数,Django提供一些可以用作视图的类
基于类的视图使用Python 对象实现视图,它提供除函数视图之外的另外一种方式


view 属性
http_method_names:添加未知的请求方法


方法
as_view():将类视图转换成可被调用的函数视图
dispatch(): 根据请求去匹配http_method_names下的对应函数去处理请求
http_method_not_allowed():返回405错误


实例
from django.views import View
class IndexView(View):
    http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘,‘list‘]
    def get(self,request,*args,**kwargs):
        return HttpResponse(IndexView)

    def post(self,request,*args,**kwargs):
        data = request.POST
        return HttpResponse(data)
    #需要将list方法加入 http_method_names,否则会经过,dispatch,http_method_not_allowed():返回405错误
    def list(self,request,*args,**kwargs):
        return HttpResponse("ListView")
        
        
请求方式:
In [27]: import requests                                                                
In [28]: url = ‘http://192.168.33.10:8080/dashboard/index/‘                             
In [29]: res = requests.request(‘list‘,url)                                             
In [30]: res.content                                                                    
Out[30]: b‘ListView‘




 

Django URL路由

上一篇:转!!关于http请求 浏览器 中文编码


下一篇:websocket消息订阅