Day47 Django基础部分、路由配置、空间名称
1.最简单的路由配置
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。
1.1
例1:
第一步:在
urls.py中写入
urlpatterns = [path('admin/', admin.site.urls),path('articles/', views.articles), ]
在views.py中写入给请求返回的response对象
def articles(request):print("文章页")return HttpResponse("文章页")
小结:上面这种是最基本的,不带url后面不带任何参数的。
1.2 path方法把url写死了
urls.py中写入
path("articles/2009/", views.articles),
访问变成了:
原来的articles/没有用了,路由信息的改变。
1.3re_path
# 为了解决path上面把url写死,用re_path
目的:减少代码冗余,用正则来写
# articles中需要一个接受参数# 在urls.py文件中写,其中artcles函数需要一个接受参数re_path("^articles/([0-9]{4})/$", views.articles1), # 无名分组 小结;需要在views函数中写一个形参,才能接受
([0-9]{4})/$匹配出来的参数
# 于是在views中加入一个参数。
def articles(request, y): print("文章页") return HttpResponse("文章页")
运行结果如下: 小结:这样就可以实现的多个url的输入,满足正则即可。# articles中需要2个接受参数# urls中的代码:
re_path(r"^articles/([0-9]{4})/([0-9]{2})/$", views.articles), # 无名分组按位置传参数,articles后面的参数依次传给views 中的articles函数# views中的代码:
def articles(request, y,m): print("文章页", y, m) return HttpResponse("文章页")
pycharm中控制台打印出的代码:
# 即是获取到了/articles/后面的 /2019/12/等2个参数
## 注意^ 和$ 的使用
1.4 URl和re_path如果要匹配正则规则都需要使用^和$来卡,path内部限制死了的(必须完全匹配)
1.5
1. path 内部封装好了,自动限制首尾的规则 2. url 没有封装,需要自己手动添加正则规则(同re_path方法)# 在url前后加上参数都是可以访问的 /dsdarticles/ 可以访问 /articles/sdad 可以访问 如果要卡的话 需要自己写上正则来匹配# path内部前后都卡死了的,其中re_path 和url是一样的
urls中的代码:
url('articles/', views.articles_url),views中的代码:(上面的2种情况都是没有参数的 哈哈)
def articles_url(request): print("文章页") return HttpResponse("文章页")
1.6无名分组见上面
按位置传参
1.7 有名分组(按关键字传参)
##(1)传入一个参数给views中函数/2019
url.py代码:
re_path("^articles/(?P<year>[0-9]{4})/$", views.articles1), # 有名分组views中的函数:处理接受到的url的函数:articles1:
def articles1(request, year): print("文章页111", year) return HttpResponse("文章页1111")
##(1)处理客户端url中的参数是2个的,参数传参是关键字传参。
urls.py文件中代码:
re_path(r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.articles),#得出url传给articles中的参数是2个 都是关键字传参 在函数articles中必须写上month和year才行。views中代码:
def articles(request, month, year): print("文章页面", year, month) return HttpResponse("文章页")
1.8
说白了,就是客户,各种输入你内部就行,接受判断并返回。客户输入的形式/articles/参数/参数 我们需要在内部就行处理,接受参数(有名分组合(关键字传参必须是在url中定义的参数,
在views中对应的函数中的参数)无名分组(按形参顺序就行传参,对应在views中的函数中的参数,可以随便取名,接受就行))
小结:针对1.1-1.8的路由层面的
1.url和re_path差不多,内部没有限制,可以在前面加参数或者后面加参数就行访问,但是只能每次在项目下URls下添加路由,有点麻烦。
2.解决1的麻烦就是在url和re_path中使用正则表达式,可以在访问/articles/.... 前面不变的情况下 增加更多的参数的 上面介绍了加1中参数和2中参数到我们视图处理函数views中,对应接受就行。
# 上面的URl中的路由信息全部写在了主项目中url中:
3.不足的地方:每次都需要在主项目的urls中去写上路由的配置信息,有点繁琐,不利于维护。
解决办法:在每一个app中建立url,在主项目下的url创建分组,从主文件向下app的url中找即可。
2.路由分发
在上图的主项目的url中写上上面的路由分发。
然后对应在app01的url写上真的路由信息:
然后对应在app01的url写上真的路由信息:(同下)
在app02的URls中写上真的路由信息:(只是在主项目的文件下url中就行查找,是哪个下对应的url路由信息,不至于不像之前没有分组的时候那么乱,全部写在一起,只需要在主文件的URl写上最上面的那个信息即可)
# 类似于在广东省下面去找深圳市是一样的道路
views中的代码:
def test(request): return HttpResponse('app02-test')
3.反向解析
3.1例子:暂时还没有用反向解析
在app01 url.py中的代码是:
from django.urls import path, re_path from app01 import viewsurlpatterns = [path('test/', views.test),path('articles/', views.articles_url),path('login/', views.login, name="login"),path('index/', views.index) # 当登录成功 重定向跳转index 也必须配置在这个下面]
app01中的views的代码是:
def login(request):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:return redirect('app01/login')def index(request):return HttpResponse("<h2>index页面</h2>")
在主项目文件夹下的模板文件夹的文件是 login.html是:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>用户登录</h3> <form action="/app01/login/" method="post"><p>用户名:<input type="text" name="username"></p><p>密码: <input type="password" name="pwd"></p><input type="submit"> </form></body> </html>运行结果:登录成功 成功跳转!
3.2 使用反向解析
3.2.1
path('login/', views.login, name="login"), 个人觉得还是改的是设计login的地方 没啥卵用!
分析:首先我们将这个路由不改动的时候, 第一步:我们是先去解析出路由ulr,本句是没使用正则的,即是 第二步:我们是去在视图函数的login,处理一些用户需要的逻辑,首先,本句是登录,根据函数中的逻辑去调用temprate 中的登录模板的,然后,再次提交数据的时候,会调用index,完成本次访问。 也就是Django内部的一个执行流程。 小结:即是变动的时候,我们去改语句中对应的视图函数,和对应用到的模板2个地方即可。
当去修改'login/' 为'login2/'会导致很多地方都会修改!所以这个时候会利用到别名啦!注意:用户实际登录的时候还是使用的是login2去登录,反向解析只是让内部少做变动。(1)模板中的文件login.html需要改动(2)视图函数中的login改动在template下修改login.html文件为:只需在上面的基础上修改第一行为:<form action="{% url 'login' %}" method="post">其中一旦url中配置文件一改变,模板文件中的temptate下的login.html 和views视图下的文件也需要跟着去改:具体改法如下:重点1:修改模板temprate中的文件 login.html
运行代码:
根据视图函数login可以知道第一次确实是得到页面。
重点2:(反向解析改动的第二个地方,视图函数)
# view中的函数 def login(request):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:# return redirect('app01/login') 不改动的时候print(reverse('login'))return redirect(reverse('login'))### 改为这样,他会自己根据url中login的变动而变动运行结果是:把下面的视图函数中的
print(reverse('login'))打印出来的值是:
再试一次:
先改url中的名字:
哈哈 按照逻辑是不会打印的是:成功是:
index那个页面跳转成功!
登录失败看看:
3.3 在反向解析的基础上就行传递参数
3.3.1 无名参数
第一:在app下的url中代码:
urlpatterns = [re_path(r'^login/([0-9]{2})/$', views.login, name="login"),path('index/', views.index)] 小结:即是用户传递的进来的是2位数的参数。
第二:
temprate下的form表单就行修改,在反向解析的前提下:
感觉就是随意放一个参数在后面,不多深究
第三:
视图view中的加参数:
1.相关的login函数是必须加的“
2.在跳转的地方加上参数
def login(request, pk):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:print(reverse('login', args=(10,))) # 无名分组return redirect(reverse('login', args=(10,))) # 位置传参运行代码:必然要输入错误的密码才会打印。 问题:个人觉得反向定位的这个地方 表单位置 根本不用加12 感觉就是乱加的没啥依据 后续看看!
3.3.2有名参数在方向解析的基础上
第一:在app01下的url的代码是:
urlpatterns = [# path('login3/', views.login, name="login"),# 没有参数的时候# re_path(r'^login/([0-9]{2})/$', views.login, name="login"),无名分组 顺序传参# 有名分组 关键字传参re_path(r'^login/(?P<m>[0-9]{2})/$', views.login, name="login"),path('index/', views.index)]
第二:
temprate下的form表单就行修改,在反向解析的前提下:
感觉就是随意放一个参数在后面,不多深究
{#<form action="/app01/login/" method="post">#}# 无名分组时候用的 <form action="{% url 'login' m=12 %}" method="post"># 有名分组时候用
第三:
视图view中的加参数:
1.相关的login函数是必须加的(这次有名分组传递的是一个参数)
2.看下视图函数中的全部代码:
def login(request, m):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:# print(reverse('login', args=(10,))) # 无名分组print(reverse('login', kwargs={"m":"07"})) # 有名分组# return redirect(reverse('login', args=(10,))) # 位置传参return redirect(reverse('login', kwargs={"m":"07"})) # 关键字传参# return redirect(reverse('app01:login')) # 加上名称空间写法# return redirect('app01/login') 不改动的时候# 没有分组 即是没有参数的情况# print(reverse('login'))# 这个也也是没有使用分组的情况 但是设计login 反正url路由将其名字改掉使用反向解析# 也就是验证那句话 哪里需要用的到地方都需要改数据,只能说使用反向解析去改的话,可以一劳永益,改一次之后# 无论你在路由怎么改写login1到login 这里都是使用的路由对应url中的别名,嘿嘿!# return redirect(reverse('login'))
运行结果:以登录失败的方式进去:结果看样子就是对的! 有名关键字传参成功
总结:
上面的例子中只是在外面套了一层重定向即是再次就行一次跳转而已。
上面登录失败,再次登录页面出现。
## 上面的例子中 登录失败可以是 #return redirect(reverse('login')) # 防止url中访问的地址改名,反向解析,并跳转,至重新登录return redirect(reverse('login', kwargs={"m":"07"})) # ,反向解析基础上加上关键字传参,最后重定向至重新登录# return redirect(reverse('login', args=(10,))) # 反向解析加上位置传参,最后重定向至重新登录
登录成功:
return redirect("/app01/index/")
反向解析大致: 1.定义name 别名 path('login1/', views.login, name="login"), 2.在视图中反向解析 from django.urls import reversereverse("login")无名分组 re_path(r'^login1/([0-9]{2})/$', views.login, name="login"), reverse("login", args=("12",))有名分组 re_path(r'^login1/(?P<month>[0-9]{2})/$', views.login, name="login"), reverse("login", kwargs={"month": "12"}) 3.在模板中使用反向解析 path方法(url)# 不使用参数的时候 <form action="{% url 'login' %}" method="post">re_path(无名分组) <form action="{% url 'login' 12 %}" method="post">re_path(有名分组) <form action="{% url 'login' month=12 %}" method="post">
4.名称空间
4.1 例子
1.新建一个app02
第一:app02中的url代码:
from django.urls import path, re_path from app02 import viewsurlpatterns = [path('test/', views.test),path('login/', views.login, name="login"), ]
第二:app02 中的视图(view中的代码)
def login(request):if request.method == "GET":return render(request, "login1.html")else:# print(request.POST)print(request.body)username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app02/test/")else:# print(reverse('login', args=(10,))) # 无名分组# print(reverse('login', kwargs={"m":"07"})) # 有名分组# return redirect(reverse('login', args=(10,)))# return redirect(reverse('login', kwargs={"m":"07"}))return redirect(reverse('app02:login'))
第三:同时建立temprate中的模板代码:
运行:app01/login1/代码发现:串了,可以在总项目的URl的配置下可以看到:
如果是访问各个app下的相同的url 下的login1会发现后面把前面覆盖了。
运行结果:
如下 发现登录的是login1窗口弹出的是app02的确实app01的访问的url被覆盖了。
解决办法:名称空间
4.2 加命名空间
1.为了出现上面在各个不同的app应用取相同的名字的:
只有加上命名空间:
第一步:
在总项目的url下面加一个:
path('app01/', include(("app01.urls", "app01"))), # 加上名称空间app01# path('app02/', include("app02.urls")), # 普通的路由分发path('app02/', include(("app02.urls", "app02"))), # 加上名称空间app02注意:include 里面是一个元祖不是一个字符串注意普通的路由分发的写法是:
path('app01/', include("app01.urls")), # 普通的路由分发path('app02/', include("app02.urls")), # 普通的路由分发
小结:即是上面的的写法是名称空间加上普通路由分发的结合写法。
第二步:修改视图函数中login中的值:(在对应的app的login函数中,重定向返回函数的时候加上)
def login(request):if request.method == "GET":return render(request, "login1.html")else:# print(request.POST)print(request.body)username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app02/test/")else:# print(reverse('login', args=(10,))) # 无名分组# print(reverse('login', kwargs={"m":"07"})) # 有名分组# return redirect(reverse('login', args=(10,)))# return redirect(reverse('login', kwargs={"m":"07"}))# return redirect(reverse('login')) 普通的反向解析# 在反向解析的基础上加上名称空间写法return redirect(reverse('app02:login'))
第三步:在模板中修改一下:
在普通的反向解析版本的基础上加上,<form action="{% url 'app01:login' %}">这个,。妈妈再也不用担心,其他的app项目设置的访问rul和我重名啦!
这样的话,访问app01 中login1:
访问app02 中login1:
总结: 1.名称空间定义名称空间 path('app01/', include(("app01.urls", "app01"))), path('app02/', include(("app02.urls", "app02"))),在conf.py源码的44行 namespace = namespace or app_name2.使用名称空间在视图中 reverse('app01:login') 在模板中 <form action="{% url 'app01:login' %}" method="post">
5. 视图层
1.request对象
1.1 reqeust对象的属性:
- GET(***)
1. GET QueryDict 响应头的内容(url后的参数) 2. 获取一个值 request.GET.get("name") 3. 获取多个值 request .GET.getlist("name") # 返回值为list
- POST(***)
- QueryDict 响应体里的内容
- body
- 原生请求体的内容
- path (***)
- 返回当前请求的路径(url)
- method(***)
- 返回当前请求的请求方式
2.1reqeust对象的方法
- get_full_path()
- 获取当前请求的完整路径(包含参数,不包含锚点)
- is_ajax()
- 判断当前请求是否是ajax请求.返回值为布尔值
2.HTTPResponse对象(响应三剑客)
2.1HTTPResponse
直接返回字符串,响应体里面的内容
2.2 render
返回一个模板文件第一个参数 request第二个参数 模板文件(login.html)第三个参数(可选) 模板需要渲染的值
2.3 redirect
重定向
转载于:https://www.cnblogs.com/longerandergou/p/11128027.html
Day47 Django基础部分、路由配置、空间名称相关推荐
- Django 02 url路由配置及渲染方式
Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...
- Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM...
web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...
- Django二级域名路由配置方案django-hosts
最终效果 http://www.mydomain.cn/api/ --> http://api.mydomain.cn/ http://www.mydomain.cn/blog/ --> ...
- django 2.0路由配置变化
urlpatterns变量的语法 urlpatterns应该是path()和/或re_path()实例的Python列表. 首先,Django会使用根路由解析模块(root URLconf)来解析 ...
- Django基础-Web框架-URL路由
Django基础-Web框架-URL路由 一.Django基础–Web框架 MVC和MTV框架 MVC 把Web应用分为模型(M).视图(V).控制器(C)三层,他们之间以一种插件式的,松耦合的方式联 ...
- Django基础---Web框架、URL路由、视图函数、模板系统
文章目录 Django基础 Django基础---Web框架 MVC和MTV框架 MVC MTV Django下载与安装 基于Django实现一个简单的示例 get请求获取数据 post请求获取数据 ...
- 学一点django基础
学一点Django基础 目录 文章目录 目录 一.Django框架的介绍 Django的安装 Django框架开发 创建项目的指令 Django项目的目录结构 URL 介绍 视图函数(view) Dj ...
- ajax调用api改表格数据库,【django基础】django接口 异步ajax请求 导出数据库成excel表(包裹前端后端)...
py文件: from django.utils.http import urlquote from rest_framework.views import APIView from django.sh ...
- python路由编程_Python Django基础二之URL路由系统
MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...
最新文章
- win10下安装TensorFlow(CPU only)
- python生成条形码
- 编程软件python中的if用法-Python高效编程的19个技巧
- VTK:模型之FinanceFieldData
- ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
- HDU - 6959 zoto 莫队 + 值域分块
- 前端学习(639):undefine和null
- kafka1.0+ 集群搭建
- php与mysql关系大揭秘_【慕课笔记】PHP与MySQL关系大揭秘
- Python扩展库安装工具pip的高级用法
- 软件定制开发,程序外包就在这
- 穷爸爸与富爸爸,背后思维的差异
- unity网站服务器,Unity基础网络服务器通信
- [wcf]入门.3.1
- 第一章 为什么我们对机器学习感兴趣?(二)
- 疯狂的华尔街速度:千分之十三秒让高频交易员创造2千万美元
- 测试工程师如何薪资过万
- PC微信机器人之实战分析微信加人call
- AutoCAD2006启动慢解决方案
- 宾州州立大学计算机排名,宾州州立大学帕克分校排名
热门文章
- java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...
- 8-4 Fabled Rooks uva11134
- Java bean 是个什么概念?
- 【FastJSON】解决FastJson中“$ref 循环引用”的问题
- ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
- Eclipse程序员要掌握的常用快捷键
- startActivityForResult的使用和用法
- (转)iReaper for wp7正式发布
- JS实现禁止浏览器后退返回上一页
- AUTOSAR专业知识篇(五)-“敏捷”适用于汽车软件开发吗?当我们谈“敏捷”,到底在谈什么?