一.URL控制系统
1.简单说明
URL配置的本质是通过URL与对应的View视图形成映射,我们在调用URL时会自动找到对应的view进行逻辑处理,及通过URL告诉Django调用那一段View代码.
2.格式
urlpatterns = [
url(‘正则表达式URL1’,views视图函数,[参数],[别名]),
url(‘正则表达式URL2’,views视图函数,[参数],[别名]),
]
参数说明:
?一个正则表达式字符串,Django会从上往下一次匹配url,匹配有值则停止往下查找;
?一个可调用的视图函数
?可选的要传给视图函数的默认参数(字典形式)
?一个可选的别名name参数,如果有了别名,在调用时可以直接用该别名,这样修改URL,其他使用别名的应用则不用修改
例如:
3.命名分组函数
命名分组函数分为:有命名分组函数和无命名分组函数,他们是通过url中的正则表达式(表达式中带小括号进行分组)是否指定名字来区分。正则表达式分组并指定了名字则为有命名分组函数,正则表达式分组但未指定了名字则为无命名分组函数。
3.1 不属于两者范畴
3.2 无命名分组函数
3.3 有命名分组函数
效果图:
4.别名
我们通过,url来映射url与view视图之间的关联,如果其他地方需要用到我们的url时,我们可以直接进行引用,例如在form表单中,点击提交之后可以使用action来跳转到另外一个url,此时我们可以直接在form的action中直接引用需要的url。但是如果直接引用,则有以下不合理的地方:
a.随着url中url地址的修改则需要修改所有到它的地方,可能会有遗漏的地方;
b.如果url地址比较长时,则所有引用的地方均需要进行重复编写,此时量比较大;
此时,我们可以直接使用别名的形式进行处理,如图url别名设置:
引用方式如图:
5.Url路由分发
在前面所有的例子中,我们只有一个app应用,如果一个项目有多个不同app引用时,我们把所有的url都放在urls.py中,不仅会显得十分混乱而且有时还会影响正常功能的使用(比如APP1中有一个url有问题,但是APP2中所有url正常,此时APP1将会影响APP2的正常使用)。此时,我们可以使用url路径分发机制来处理,如图:
项目的url(项目中统筹向下分发的url):
APP应用中的url设置:
6.
二.View视图函数
View主要是用来处理逻辑的模块,web中通过接受请求并处理请求并将处理的结果返回给请求对象。其中主要是通过http协议来完成请求的。
HTTP请求中产生两个核心对象:
http请求:HttpRequest对象;
http响应:HttpResponse对象;
http模块的位置是在django.http中。
1.HttpRequest
HttpRequest对象是由django框架内部自己自动创建的,我们在定义每个方法时必须要带上它,名字可自定义,但建议使用request。也就是说,django的view模块中所有定义的函数,必须带上一个request的参数,且request是django在接收到请求后自己创建的对象。HttpRequest对象的属性和方法实际上就是这个request的属性和方法。
HttpRequest对象的主要方法:
1.1 Request.method: http请求的方法类别,分为GET和POST两种;
1.2 request.GET.get(‘key‘):http通过GET请求传到HttpRequest的字典对象,再用get方法通过关键字获取对应的value;
1.3 request.POST.get(‘key‘):http通过POST请求传到HttpRequest的字典对象,再用get方法通过关键字获取对应的value;
1.4 Request.path:获取url的链接,返回值不带参数;
1.5 request.get_full_path():获取url的链接,若是通过get传输,则此处的值返回的是带参数值的url;
如图:
1.6
2.HttpResponse对象
对于HttpResponse对象来说,它和HttpRequest对象不同,前者必须要自己创建,而后者是django自己自动创建的。每个view请求的处理方法必须返回一个HttpResponse。
HttpResponse对象的常用方法:
2.1 HttpResponse():将内容返回到页面上,此处不需要加request参数,如图:
2.2 render():页面渲染(将html经过django后台处理后将页面效果渲染到浏览器中),推荐使用。
格式: render(request,’前端.html’)注:request参数必带;
例如:
注:其实,render()最终返回的依然是一个HttpResponse对象,源代码如下图所示:
2.3 render_to_response():也是页面渲染(将html经过django后台处理后将页面效果渲染到浏览器中)
格式:render_to_response(’前端.html’),与render()作用一样,但render_to_response()不需要带request,且render_to_response()在使用工程中可能出现问题。推荐使用render()方法。
例如:
注:其实,render()最终返回的依然是一个HttpResponse对象,源代码如下图所示:
3.View中局部变量加载到template(html文件)中的两种方式
a.通过key:value键值对字典的形式通过key获取到对应的value并加载到对应的HTML文件中,如图所示:
对应的HTML引用view中变量的方式如图所示:
此方法如果HTML中有N多个需要获取view中的局部变量时,则写的key/value键值对将添加很多,此时会比较麻烦,但是在实际使用过程中,我们在view中定义的局部变量并不会很多,推荐使用该种方式。
b.通过locals()函数将view中的所有局部变量都加载到HTML中,如图所示:
对应的HTML文件加载view中的参数方式如图所示:
此时,view中使用什么变量名,HTML中也就使用相同的变量名,此时不再使用key获取对应的value值的方式。
4.redirect()
redirect()是跳转到某一个指定的url,参数为指定要跳转的url;如图所示:
内部原理:使用redirect(url)进行跳转时,先去对应的url.py中匹配对应的redirect中指定的url,匹配成功后再去查找url对应的view函数并执行该函数。
注意:redirect()与render()的区别:
A.redirect()中必须跟的是url路径,而render()中必须是需要渲染的html文件名称;
B.redirect()跳转之后,url会变成redirect(url)指定跳转的url,而使用render()则url不会发生变化。
如图:
三.相关代码地址
https://github.com/DoneZj/django3.git
原文地址:http://blog.51cto.com/10836356/2314766