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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-3 向二分搜索树中添加元素 6-4 改进添加操作:深入理解递归终止条件

二分搜索树添加新元素60, 60>41(根节点)&#xff0c;所以一定要插入到41的右子树。 接着在和58比较 1 public class BST<E extends Comparable<E>> {//对于二分搜索树所存储的内容支持泛型&#xff0c;所以在这里写一个E&#xff0c;此外二分搜索树不是支持所有…

ClassNotFoundException:是否减慢了您的JVM?

大多数Java开发人员都熟悉臭名昭著且非常常见的java.lang.ClassNotFoundException 。 虽然通常已经很好地了解了此问题的根源&#xff08;类路径中缺少类/库&#xff0c;类加载器委派问题等&#xff09;&#xff0c;但对整体JVM和性能的影响通常是未知的。 这种情况可能会对您的…

python可以自动写文章吗_让python来告诉你神奇的操作,如何实现文章自动化

三河讲python首先来告诉大家下面的Python程序实现了通过从网页抓取一篇文章&#xff0c;然后根据这篇文章来生成新的文章&#xff0c;这其中的原理就是基于概率统计的文本分析。过程大概就是网页抓取数据->统计分析->生成新文章。网页抓取数据是通过BeautifulSoup库来抓取…

badboy的录制和jmeter的使用

v Jmeter是什么 Apache Jmeter是Apache组织开发的基于Java的压力测试工具。Jmeter可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能。另外&#xff0c;Jmeter能够对应用程序做功能、回归测试&#xff0c;通过创建带有断…

一张图看懂offsetX, clientX, pageX, screenX的区别

1.具体含义见下图1 2.浏览器的兼任情况 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

接口一个被我忽略的地方--接口重定向技术

习惯于用IDE生成接口方法了,右键点击"Implement Interface",生成所有的接口方法声明,还带个Region多方便啊.今天看<<CLR Vir C#>>时才了解到自己是知其然不知其所有然啊. 实现接口方法很简单,新手估计也都会,但怎么理解这个过程,不见得所有人都知道 Base…

vue 学习之路 —— 图片的引入

问题记录&#xff1a;在img中动态设置了src后&#xff0c;图片路径找不到 原因&#xff1a;vue中动态生成的路径无法被url-loader解析到 解决方法&#xff1a; 1、将图片放在static文件夹&#xff0c;然后正常解析 2、将图片使用import方法引入 3、 采用背景图做法&#xff0c;…

跟踪异常–第5部分–使用Spring进行计划

看来我终于快要结束本系列有关使用Spring进行错误跟踪的博客了&#xff0c;对于那些还没有阅读该系列博客的人&#xff0c;我正在编写一个简单但几乎具有工业实力的Spring应用程序&#xff0c;扫描日志文件中的异常&#xff0c;然后生成报告。 在本系列的第一个博客中&#xff…

APP测试理论知识点

什么是APP测试&#xff1f; App测试就是软件工程师对这类应用软件进行功能测试&#xff0c;性能测试&#xff0c;安全性测试以及兼容性测试等。 对于app测试我们一般采用的是黑盒测试方法&#xff0c;也会在必要的时候进行自动化测试以及性能测试&#xff0c;丙炔对于app还会有…

php接口开发 安全_PHP开发api接口安全验证的实例讲解

php的api接口在实际工作中&#xff0c;使用PHP写api接口是经常做的&#xff0c;PHP写好接口后&#xff0c;前台就可以通过链接获取接口提供的数据&#xff0c;而返回的数据一般分为两种情况&#xff0c;xml和json,在这个过程中&#xff0c;服务器并不知道&#xff0c;请求的来源…

Remove Element - LeetCode

目录 题目链接注意点解法小结题目链接 Remove Element - LeetCode 注意点 输入的数组是无序的解法 解法一&#xff1a;使用了erase函数&#xff0c;将等于val的值移除。时间复杂度为O(n) class Solution { public:int removeElement(vector<int>& nums, int val) {fo…

DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

url控制第二种写法&#xff08;只要继承了ViewSetMixin&#xff09; url(r^pub/$,views.Pub.as_view({get:list,post:create})), #获取所有记得路由后面加$结束符 #pub/?formatjsonurl(r^pub\.(?P<format>\w)$,views.Pub.as_view({get:list,post:create})), #pu…

[导入]C#好书盘点【月儿原创】

C#好书盘点【月儿原创】 文章来源:http://blog.csdn.net/21aspnet/archive/2007/07/07/1682200.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/07/08/816177.html

岁月如歌,人生如诗

虎跃千山龙腾海&#xff0c;春满家园喜满怀。新的一年&#xff0c;孕育着新的生命&#xff1b;新的一年&#xff0c;掸去了飞雪的扬花&#xff0c;满心的惬意告诉我们&#xff0c;所有的期盼与期望&#xff0c;一切的向往与憧憬正向着我们走近&#xff0c;向着春天融合。 ​ 新…

倒叙输出 php,php foreach正序倒序输出示例代码

实现代码&#xff1a;// 正序foreach($files as $file_num > $file) {if(is_file($directory.$file)){//$file iconv("gb2312","UTF-8",$file); //或者 iconv("gb2312","UTF-8",$value);$date substr($file,0,9);echo ;echo ;ech…

黑色系产业结构

转载于:https://www.cnblogs.com/luoluo-123/p/11143867.html

Smart Form Tutorial(适用新手学习)

发现Smart Form在ECC6中和4.6C相比改变了不少&#xff0c;最近重新研究了一下。help.sap.com上的文档基本上是针对新特性的&#xff0c;不过例子却还是旧的。做个笔记省的以后找不到最新的example。最大的改变在Table上&#xff0c;现在table的header和footer比以前好做了。还是…

执行命令npm install XXX后仍然提示 Cannot find Module XXX

最近遇到一个问题&#xff0c;在服务器上配置完node环境后 执行npm start 命令后提示 Cannot find Module "Jquery" 然后就知道可能没有安装jquery 就继续在当前文件夹下执行 npm install jquery 但是再次执行后却仍然提示 Cannot find Module "Jquery"…

青蛙学Linux—Zabbix Web使用之Zabbix发现功能①自动网络发现

Zabbix的发现功能用于自动发现主机或者监控数据&#xff0c;包括以下三种发现类型&#xff1a; 自动网络发现&#xff08;Network discovery&#xff09;主动客户端自动注册&#xff08;Active agent auto-registration&#xff09;低级别发现&#xff08;low-level discovery&…

php 修改 wordpress,wordpress怎么编辑代码修改页面

wordpress是用PHP写的。PHP是服务器端执行脚本文件。然后到客户端(就是网页)生成html文件。你看到的html代码都是PHP程序在服务器端执行后生成的。若要修改代码主要是看想修改那一部分的内容。然后找到其对应的PHP代码.然后修改。在后台点击-->,就能看见你现在使用的wp主题的…