Python框架篇之Django(路由系统URL、视图函数views)
原创
©著作权归作者所有:来自51CTO博客作者mb62e7593c01ba5的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
一、路由系统(URL)
1、URL配置 (URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。
简单来说,我们就是用这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
- 正则表达式:url路径的正则
- views视图函数:通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:可选的name参数,其他地方调用都是用的别名
2、例如:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'jiu': 'ok'}),
]
3、无名分组
('article/(\d{4})/(\d{2})', views.article_year),
# 表示article后可匹配任意4个数字,都能打开该页面
# 加()将正则内容分组,就可以获取到对应的值了,就是说页面的网址也会跟着变成输入的那4个数字
# 简单来说就是一个分组会对应article_year函数的一个参数
4、有名分组
# 有名分组:分别起名为year和month,这样对应的形参也必须同名
url(r'article/(?P<year>\d{4})/(?P<month>\d{2})', views.article_year),
url(r'register/', views.register, name="reg"), # reg是这个地址的别名,在其他文件里都可以使用
5、路由分发(include)
# 自动路由分发,要导入include
path('blog/', include('blog.urls')),
# 名字为urls,因此需要在blog目录下建立一个urls文件,将这些需要分发到一堆的路径都粘贴进去
# 意思就是以blog开头的内容,全都到blog.urls里面去找
二、视图函数(views)
1、http请求 中产生两个核心对象:
- http请求:HttpRequest对象
- http响应:HttpResponse对象
2、HttpRequest(请求)的属性和方法
- path:请求页面的全路径,不包括域名
- method: 请求中使用的HTTP方法的字符串表示。全大写表示
if req.method=="GET":
do_something()
elseif req.method=="POST":
do_something_else()
- GET: 包含所有HTTP GET参数的类字典对象
- POST: 包含所有HTTP POST参数的类字典对象
服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method==“POST”
- COOKIES:包含所有cookies的标准Python字典对象;keys和values都是字符串
- FILES:包含所有上传文件的类字典对象,FILES中的每一个Key都是标签中的
(1)filename: 上传文件名,用字符串表示
(2)content_type: 上传文件的Content Type
(3)content: 上传文件的原始内容 - user:代表当前登陆的用户
- session:唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用
- request.POST.getlist(’’):常用获取内容的方法
3、HttpResponse(响应)
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。
每个view请求处理方法必须返回一个HttpResponse对象,HttpResponse类在django.http.HttpResponse中。
- 页面渲染:render(常用)、render_to_response(少用)
return render(req, "index.html", locals())
# 参数:请求对象,要返回的页面,返回前端的全部键值对——这里表示{"time":t}
= req.POST.get("user")
if user=="zahuw":
return redirect("/login/")
# 就相当于是http://127.0.0.1:8080/login/
# 若改成:return redirect("login.html")
# 这样跳转到页面url不会变,仍然是原来的url,一刷新就回到原来的页面了
# return render(req,"index.html",{"action":li,"d":dic,"c":ani}) # 手动列出来
return render(req,"index.html",locals()) # 全部获取