Django基础-路由
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中取键名的问题.
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- django基础3--路由系统及部分app基础
- Django基础学习三_路由系统
- Django基础知识 URL路由系统详解
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- Django基础之路由系统
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- Django基础二之URL路由系统
- 在win10+anaconda的环境基础上,安装django遇到的错误django-admin.py
- Django基础,Day4 - views 详解
- Python基础(Django二——Form)
- django中的路由规则
- django基础
- WPF基础路由事件学习
- django基础4--模板独立
- django基础
- python后台架构Django教程——路由映射urls
- Django-路由Routers-SimpleRouter-DefaultRouter的使用
- 【django学习笔记】01 HTTP协议基础与一个简单的web服务端实例
- Django基础(二)