南油网站建设沈阳专业网站制作
南油网站建设,沈阳专业网站制作,网站界面设计方案,wordpress仿站教程20161.最简单的路由配置 URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表#xff1b;你就是以这种方式告诉Django#xff0c;对于客户端发来的某个URL调用哪一段逻辑代码对应执行。 1.1 例1#xff1a; 第一步#xff1a;在…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/(?Pyear[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/(?Pyear[0-9]{4})/(?Pmonth[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, namelogin),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(h2index页面/h2) 在主项目文件夹下的模板文件夹的文件是 login.html是 !DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
h3用户登录/h3
form action/app01/login/ methodpostp用户名input typetext nameusername/pp密码: input typepassword namepwd/pinput typesubmit
/form/body
/html运行结果登录成功 成功跳转 3.2 使用反向解析 3.2.1 path(login/, views.login, namelogin), 个人觉得还是改的是设计login的地方 没啥卵用 分析首先我们将这个路由不改动的时候
第一步我们是先去解析出路由ulr本句是没使用正则的即是
第二步我们是去在视图函数的login处理一些用户需要的逻辑首先本句是登录根据函数中的逻辑去调用temprate 中的登录模板的然后再次提交数据的时候会调用index完成本次访问。
也就是Django内部的一个执行流程。
小结即是变动的时候我们去改语句中对应的视图函数和对应用到的模板2个地方即可。 当去修改login/ 为login2/会导致很多地方都会修改所以这个时候会利用到别名啦注意用户实际登录的时候还是使用的是login2去登录反向解析只是让内部少做变动。(1)模板中的文件login.html需要改动2视图函数中的login改动在template下修改login.html文件为只需在上面的基础上修改第一行为form action{% url login %} methodpost其中一旦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, namelogin),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, namelogin),# 没有参数的时候# re_path(r^login/([0-9]{2})/$, views.login, namelogin),无名分组 顺序传参# 有名分组 关键字传参re_path(r^login/(?Pm[0-9]{2})/$, views.login, namelogin),path(index/, views.index)] 第二 temprate下的form表单就行修改在反向解析的前提下 感觉就是随意放一个参数在后面不多深究 {#form action/app01/login/ methodpost#}# 无名分组时候用的
form action{% url login m12 %} methodpost# 有名分组时候用 第三 视图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, namelogin),
2.在视图中反向解析
from django.urls import reversereverse(login)无名分组
re_path(r^login1/([0-9]{2})/$, views.login, namelogin),
reverse(login, args(12,))有名分组
re_path(r^login1/(?Pmonth[0-9]{2})/$, views.login, namelogin),
reverse(login, kwargs{month: 12})
3.在模板中使用反向解析
path方法(url)# 不使用参数的时候
form action{% url login %} methodpostre_path(无名分组)
form action{% url login 12 %} methodpostre_path(有名分组)
form action{% url login month12 %} methodpost 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, namelogin),
] 第二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 %} methodpost 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85955.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!