您的位置:首页 > 编程语言 > Go语言

Django基础-路由

2019-08-18 16:05 519 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Last_G/article/details/99705749

Django-路由

1.定义

广义上的url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

Django中的url是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http页面数据

2.格式

django 项目中的url规则定义放在project 的urls.py目录下:

2.1url

urlpatterns = [
url(regex, view,kwargs,name),  #regex=r'^name/$'  ^表示开头,/表示结束
]
  • url()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。下面是具体的解释:

  • regex:
    regex是正则表达式的通用缩写,它是一种匹配字符串或url地址的语法。Django拿着用户请求的url地址,在urls.py文件中对urlpatterns列表中的每一项条目从头开始进行逐一对比,一旦遇到匹配项,立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!
    需要注意的是,regex不会去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。

性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,你通常感觉不到。

  • view:
    当正则表达式匹配到某个条目时,自动将封装的HttpRequest对象作为第一个参数,正则表达式“捕获”到的值作为第二个参数,传递给该条目指定的视图。如果是简单捕获,那么捕获值将作为一个位置参数进行传递,如果是命名捕获,那么将作为关键字参数进行传递。
  • kwargs:
    任意数量的关键字参数可以作为一个字典传递给目标视图。
  • name:
    对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。

2.2path

格式:

urlpatterns = [
path(route, view, kwargs, name)
]

其参数与url基本类似

route中可用自动类型转换

str - 匹配字符串(不写的话默认此类型) 不含最后的斜线
int - 整数
slug - 匹配ASCII字母和数字,含下划线和减号
uuid - 匹配UUID返回一个UUID实力对象(该对象必须包括破折号—,UUID中的字母全部为小写)
path - 匹配所有不为空的路径,含最后的斜线

3.url 配置举例

3.1url传递参数:

1 无参数情况
配置URL及其视图如下:
url(r'^hello/$', hello)
def  hello(request):
return   HttpResponse( "Hello World" )
访问http://127.0.0.1:8000/hello

2传递一个参数 配置URL及其视图如下,URL中通过正则指定一个参数:
url(r'^plist/(.+)/$', helloParam)
def   helloParam(request,param1):
return  HttpResponse( "The param is : "   +   param1)
访问http://127.0.0.1:8000/plist/china
3传递多个参数 参照第二种情况,以传递两个参数为例,配置URL及其视图如下,URL中通过正则指定两个参数:
url(r'^plist/p1(\w+)p2(.+)/$', helloParams)
def  helloParams(request,param1,param2):
return   HttpResponse(param1  +param2)
访问http://127.0.0.1 :8000/plist/p1chinap22012/ 从这里可以看出,视图的参数是根据URL的正则式,按顺序匹配并自动赋值的。虽然这样可以实现任意多个参数的传递,但是却不够灵活,URL看起来很混乱,而且由于是正则匹配,有些情况下容易出错。
4 通过传统的”?”传递参数 例如,http://127.0.0.1:8000/plist/?p1=china&p2=2012,url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。 通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。 配置URL及其视图如下:
url(r'^plist/$'  , helloParams1)
def   helloParams(request):
p1 =  request.GET.get(p1)
p2  = request.GET.get(p2)
return   HttpResponse( "p1 = "   +   p1  +   "; p2 = "   +   p2)

3.2url的传递

3.2.1 同一个文件夹

#在views.py文件中定义一个 index函数
#然后在文件夹的 urls.py里调用
#注意这里的 views 和 urls 都是约定俗成的 并不是一定要在这里定义
#views.py
def index(request):
return HttpResponse('hello')
#urls.py
urlpatterns=[
url(r'^index/$',views.index,name='index'),
]
#注意我这里并没有导入模块,这个文件夹是主文件夹
#这样在浏览器输入 http://127.0.0.1:8000/index  就能调用到views.py里面的index函数函数,这里会在页面上出现hello

3.2.2在app文件夹里定义url

当你创建一个app后请记得将它加入到setting中去

#当你新建一个app时,你会发现文件夹中并没有views.py这个模块 需要自己创建
#在这里将在app。views中定义一个index函数 要用路由访问到
#下面的模块都是在app文件夹内
#views.py
def index(request):
return HttpResonse('hello')
#app.urls.py
urlpatterns=[
url(r'^index/$',views.index,),
]
#下面的是在主文件夹
#url.py
urlpatterns=[
url(r'^app/$',include'views.urls')  #利用include 将'app/'请求都交给views的url去处理
]

#这时的访问为: http://127.0.0.1:8000/app/index,返回也为hello

4.一个实际例子

这是一个能够注册登录,利用cookie保持登录的程序

#主文件夹
#url.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('work/', include('Dwork_app.urls')),
path('session/', include('session.urls')),
]
#Dwork_app文件夹
#url.py
from django.conf.urls import url
from django.urls import path

from Dwork_app import views

urlpatterns = [
url(r'^login/$', views.login),
url(r'^register/$', views.register),
path('main/',views.main,name='main')
]
#views.py
from django.http import HttpResponse
import redis
from django.shortcuts import render, redirect

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

def register(request):
name = request.GET.get('user_name',)
pd = request.GET.get('password',)
if name == None or pd == None:
return HttpResponse('输入有空值')
if r.hexists('1', name):
return HttpResponse('用户名已存在')
r.hmset('1', dict)
str = "/work/main/?name=" + name
response = redirect(str)
response.set_cookie(key=name, value=pd, max_age=3600)
return response

def login(request):
name = request.GET.get('user_name')
pd = request.GET.get('password' )
if name==None or pd==None:
return HttpResponse('输入有空值')
str = "/work/main/?name=" + name
response = redirect(str)
response.set_cookie(key=name, value=pd, max_age=3600)
if r.hexists('1', name):
if r.hget('1', name) == pd:
return response
else:
return HttpResponse('密码错误')
else:
return HttpResponse('无此用户名')

def main(request):
name = request.GET.get('name')
response = HttpResponse('cookie已失效')
if request.COOKIES.get(name) is None:
return response
else:
return render(request, 'successed.html')

# Create your views here.

注意上面的40行的**str = “/work/main/?name=” + name **在2.2.1中提到过的正则匹配不会匹配?后面的在这里得到了应用,解决了从cookie中取键名的问题.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: