WebFramework-Basis-2nd
周日,晴,记录生活分享点滴
参考博客:
Django 1.2
本质是URL模式以及要为该URL模式调用的视图函数之间的映射表
urlpatterns = [ url(正则表达式, view函数, 参数, 别名), ] ? urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index , {"a":'123'} , 'FFF'), ]
参数说明:
-
一个正则表达式字符串
-
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
-
可选的要传递给视图函数的默认参数(字典形式)
-
一个可选的name参数 (别名)
示例:
from django.conf.urls import url from app01 import views ? urlpatterns = [ url(r'^index/', views.index), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
无命名分组
加了( )后,视图函数需要添加一个形参,都为字符串类型
# urls.py ? from django.conf.urls import url from django.contrib import admin ? from app01 import views ? urlpatterns = [ ? # url为articles/2003/时执行 url(r'^articles/2003/$', views.special_case_2003), ? # url为articles/2020/,除 2003 外时执行 url(r'^articles/([0-9]{4})/$', views.year_archive), # no_named group ? # url为articles/2020/07/时执行 url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), ? # url为articles/2020/07/0123456789 时执行 url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), # "+"表示重复数字无穷次 ? ]
# 视图函数(views.py): ? def year_archive(request,y): return HttpResponse(y+"year"+m+"month") # 后端在接收时,无须按照指定名字执行 # 当在url中输入articles/2020/07时,输出:2020year07month
命名分组
视图函数形参名为分组名
在 re 中
import re ? ret=re.search('(?P\d{3})/(?P ','weeew34ttt123/ooo') ''' ?P:固定格式,指分组时有名字的\w{3}) :名字为id ''' ? print(ret.group()) # 123/ooo print(ret.group('id')) # 123 print(ret.group('name')) # ooo:名字为name \d{3}:匹配3个数字 \w{3}:匹配3个非数字的内容,即字母
在 django 中
# urls.py ? from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P[0-9]{4})/$ ', views.year_archive), url(r'^articles/(?P[0-9]{4})/(?P ', views.month_archive), url(r'^articles/(?P[0-9]{2})/$ [0-9]{4})/(?P ', views.article_detail), ][0-9]{2})/(?P [0-9]{2})/$
# 视图函数(views.py): ? def year_archive(request,year): return HttpResponse(year+"year"+month+"month") # 后端在接收时,必须按照指定名字执行 # 当在url中输入articles/2020/07时,输出:2020year07month
参数
加上参数时,对应的视图函数,必须加上一个形参,形参名必须与参数名相同
如果参数名与正则分组名字相同时,后面覆盖前面
urlpatterns = [ url(r'^index/', views.index , {"a":'123'} , 'FFF'), ] def index(req, a): return render(req, "index.html") # 123
别名
加载时,一行一行去查找 url 中 name = ‘new_login’ 的行 , 然后替换
urlpatterns = [ url(r'^index/', views.login, name = 'new_login'), ] ? # 用法:
URL映射分发
每当Django 遇到 include()
时,它会去掉URL 中匹配的部分并将剩下的字符串发送给包含的URLconf 做进一步处理
from django.conf.urls import url,include ? urlpatterns = [ url(r'^hot/', include('app01.urls')), ]
例子中的正则表达式没有包含 $
(字符串结束匹配符),但是包含一个末尾的斜杠。
from django.conf.urls import url,include from app01 import views ? urlpatterns = [ url(r'^all/', views.allpage), ]
页面访问 http://127.0.0.1:8000/hot/all
Django Views(视图函数)
http请求中产生两个核心对象:
-
http请求:HttpRequest对象
-
http响应:HttpResponse对象
所在位置:django.http
视图函数接收的参数request就是HttpRequest
检测方法:isinstance(request,HttpRequest)
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都是"file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys: filename: 上传文件名,用字符串表示 content_type: 上传文件的Content Type content: 上传文件的原始内容 ? user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你 可以通过user的is_authenticated()方法来辨别用户是否登陆: if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware 时该属性才可用 session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
HttpRequest对象的方法:
get_full_path() 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path() 得到的结果就是/index33/?name=123
HttpResponse对象:
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。
每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse 类在 django.http.HttpResponse
-
页面渲染:render,render_to_response,
-
页面跳转:redirect
-
locals(): 可以直接将函数中所有的变量传给模板
from django.shortcuts import render,HttpResponse,redirect,render_to_response import time ? def index(request): times = time.time() return render(request,'index.html',{"times":times}) # 页面渲染 return render(request,'index.html',locals()) # 页面渲染 , HTML文件路径在Setting文件中做了拼接处理! return render_to_response('index.html',locals()) # 页面渲染 , 可以不用填写request return redirect('/login') # 跳转
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1>{{ times }}h1>
body>
html>