一、视图的概念
(1) 视图的作用
接收用户的请求 并响应给用户
(2) 视图函数的本质
python的函数
(3) 视图的响应
网页
- 重定向
错误模板
- 404 NOT_FOUND
- 500 SERVER_ERROR
- 400 BAD_REQUEST
- json 数据
二、url配置
路由:
处理url地址与视图函数之间的程序 称之为路由
(1) 配置
制定根级的url(django帮你配置好的)
ROOT_URLCONF = 'helloworld.urls'
(2) urlpatterns 列表
装有所有路由地址的列表
url 参数:
- regexp 正则
- view 视图函数名
- name 给当前的url起名字 (url的反向解析)
url中正则的参数的使用:
- r 必须 转义特殊字符
- ^ 必须 必须完全匹配
- $ 必须 必须完全匹配
注意: 也就是正则路由存在 ^和$就是和url请求的地址完全匹配 而不是 包含关系
(3) 不带参数的url
urlpattern = [
url(r'^test/$', views.test),
]
views.py
def test(req):
return HttpResponse('test')
(4) 带一个参数的url
urlpattern = [
url(r'^arg/(\d{2})/$', views.test), #参数2个数值
]
views.py
def arg(req,arg1):
return HttpResponse(arg1)
请求地址为 :http://127.0.0.1:8000/arg/11/
注意:
路由地址想要带参数 则必须添加() 作为值的存储
(5) 带多个参数的url
urlpattern = [
url(r'^args/(\w{2})/(\w{2})/$',views.args) #带多个参数的路由地址
url(r'^args/(\w{2})_(\w{2})/$',views.args), #带多个参数的路由地址
]
#带多个的参数的视图函数
def args(req,arg1,arg2):
return HttpResponse('arg1的值为{} arg2的值为{}'.format(arg1,arg2))
(6) 一个视图函数 是否可以有多个路由地址
路由地址和flask一样,可以多个路由指向同一个视图函数
三、反向解析
概述: 如果模板中的链接或者使用的url为硬链接 则路由地址一旦发生改变 所有地址都要修改 增加了后期代码的维护 所以所有地址都要动态生成 减轻后期维护
作用于: 模板中
使用方法:
在helloworld/urls.py的 include 添加namespace属性
url(r'^',include('App.urls',namespace='App')),
给App/urls.py 的url方法 添加name属性
url(r'^test/$', views.test,name='test'), # /test/
在模板中使用
<h1>反向解析</h1> <a href="/test/" target="_blank">去test视图函数</a> <hr> <a href="{% url 'App:test' %}" target="_blank">去test视图函数</a>
四、request对象
(1) request对象
每个视图函数 都必须有一个形参 接受django传递过来的用户请求的对象 request
(2) 概述
服务器接收到用户请求以后 会创建出request对象 视图的第一个参数 就是request对象
(3) 属性
- path 只请求的路径
- method 获取请求的方式
GET 获取get请求参数
获取某一个参数
request.GET.get('key')
如果key重名
request.GET.getlist('key')
- POST 获取POST的请求参数
- FILES 获上传文件
- COOKIES 获取请求过来的cookie
- session 获取session数据
META 包含了http请求的所有header头信息
格式化后显示
def requestAttr(request): values = request.META.items() html = [] for k,v in values: html.append('<tr><td>{}</td><td>{}</td></tr>'.format(k,v)) # return HttpResponse('request属性') return HttpResponse('<table>%s</table>'%'\n'.join(html))
常用的key值
- REMOTE_ADDR 库户端IP地址
- HTTP_USER_AGENT 浏览器和系统的信息的字符串
- HTTP_REFERER 获取从哪里点击过啦的链接地址
(4) 方法
- get_full_path() 获取完整的请求(不包括域名和端口)
- get_host() 获取主机和端口
- is_ajax() 判断是否为ajax请求
五、HttpResponse 响应
概述: 给浏览器进行响应
(1) 响应的方法
HttpResponse()
特点: 不调用模板 直接进行内容的响应
实例:
from django.http import HttpResponse
def index(request):
return HttpResponse('响应内容')
属性:
res = HttpResponse()
- res.content 设置/获取内容
- res.status_code 设置/获取状态码
- res.charset 设置/获取字符编码
方法:
- write() 写内容
- set_cookie() 设置cookie
- delete_cookie() 删除cookie
六、重定向 redirect
- HttpResponseRedirect
- redirect
(1)HttpResponseRedirect/redirect 重定向
导入:
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
实例
测试用视图和路由地址
url(r'^$',views.index,name='index'),
def index(request):
return render(request,'index.html')
url(r'^args/(\w+)/(\d{1,2})/',views.args,name='args'),
#带参数的路由地址
def args(request,name,age):
return HttpResponse("name:{}\nage:{}".format(name,age))
跳转无参路由地址 index
url(r'^redirect/$',views.myRedirect,name='myRedirect'), #测试重定向的路由
#重定向测试的视图函数
def myRedirect(request):
#不带参的重定向 跳转到首页
return HttpResponseRedirect('/')
return redirect('/')
跳转有参路由地址 args
#重定向测试的视图函数
def myRedirect(request):
#带参的重定向 跳转到args
return HttpResponseRedirect('/args/lisi/18/')
return redirect('/args/lisi/18/')
(2) reverse 通过namespace 和url的name值 反向构造出路由地址
reverse 和 flask中的url的作用一样
导入
from django.urls import reverse
构造不传参路由地址
reverse("App:testResponse") #动态解析路由地址 == url_for()
/testresponse/
构造传参路由地址
reverse("App:args",args=['wangwu',20])
/args/wangwu/20/
关键字参数构造路由地址
将App/urls.py的url中的正则路由更改
url(r'^args/(?P<name>\w+)/(?P<age>\d{1,2})/',views.args,name='args'),
反向解析路由地址关键字参数
reverse("App:args",kwargs={'name':'wangwu','age':20})
/args/wangwu/20/
(3) redirect和reverse组合使用
#重定向测试的视图函数
def myRedirect(request):
#正常传参
return HttpResponseRedirect(reverse("App:args",args=['wangwu',20]))
#关键字传参
return redirect(reverse("App:args",kwargs={'name':'zhaoliu','age':30}))
(4) 模板中的动态生成url地址
1) 无参路由
<a href="{% url 'App:index' %}">首页</a> #/
2) 构造带参路由地址
<a href="{% url 'App:args' 'lisi' 20 %}">args</a> #/args/lisi/20/
3) 关键字参数构造路由地址
<a href="{% url 'App:args' name='lisi' age=20 %}"> #/args/lisi/20/
注意:
关键字参数的路由地址为
url(r'^args/(?P<name>\w+)/(?P<age>\d{1,2})/',views.args,name='args'),
七、COOKIE 操作
(1) 设置cookie
Response.set_cookie(
key,
value,
max_age,
expires,
path, 生效的路径
domain, 生效的域名
secure, 设置HTTPS传输
httponly, 仅http传输 不能使用js获取cookie
)
过期时间都是以秒为单位的
实例:
#路由地址
url(r'^setcookie/',mycookie.set_cookie,name='setcookie'),
#设置cookie
def set_cookie(req):
# return HttpResponse('set_cookie')
res = HttpResponse('设置cooke')
res.set_cookie('name','zhangsan') #默认浏览会话结束
return res
(2) 设置cookie并设置过期时间
url(r'^setcookielifetime/',mycookie.set_cookie_lifetime,name='set_cookie_lifetime'),
#设置cookie并设置过期时间
def set_cookie_lifetime(req):
res = HttpResponse('设置cooke并设置过期时间')
# res.set_cookie('name','lisi',max_age=60)
res.set_cookie('name','lisi',expires=60)
return res
(3) 获取cookie
url(r'^getcookie/',mycookie.get_cookie,name='get_cookie'),
#获取cookie
def get_cookie(req):
print(req.COOKIES)
value = req.COOKIES.get('name')
return HttpResponse("值为{}".format(value))
(4) 删除cookie
url(r'^deletecookie/',mycookie.del_cookie,name='del_cookie'),
#删除cookie
def del_cookie(req):
res = HttpResponse('删除cookie')
res.delete_cookie('name')
return res
八、session
概述: http是无状态协议 每一次请求都是一个新的会话
使用cookie和session进行用户状态的维持 在客户端或者客户端和服务器端 存储有关会话的数据
存储方式:
- cookie 将所有数据都存储在客户端,都是明文存储,所以不要存敏感的数据,并且存储数据有大小的限制
- session 将数据存储在服务器端,客户端使用cookie存储session的唯一id值,sessionid
(1) 开启session
settings.py文件
INSTALLED_APPS = [
'django.contrib.sessions',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
(2)使用session
启用session后 每一个request请求 都有session属性
(3) 设置session
生成session存储所需要的系统表
python3 manage.py migrate
设置:
request.session[key] = value
#设置session
def set_session(req):
req.session['name'] = 'zhangsan'
req.session['sex'] = 'sex'
return HttpResponse('设置session')
(4) 设置session并设置过期时间
session默认存活时间为两周
request.session.set_expiry(value)
value值:
- integer 整数 秒
- 0 当前浏览会话结束
- datetime
- timedelta
- None 依赖于全局session过期
#设置session并设置过期时间
def set_session_lifetime(req):
req.session.set_expiry(60) #过期时间1分钟
req.session['name'] = '张三'
return HttpResponse('设置session并设置过期时间')
(5) 获取session
#获取session
def get_session(req):
print(req.session)
v = req.session.get('name','default')
return HttpResponse('获取session-----{}'.format(v))
(6) 删除 session
- clear() 清空所有session 但是不会将表中的session清除
- flush() 清空所有 并删除表中的session数据
- logout(request) 清空所有 并删除表中的session数据
- del request.session['name']
clear 清空所有session 但是不会将表中的session清除
#清除session
def del_session(req):
req.session.clear() #清除所有session 不删除表中数据
return HttpResponse('清除session')
flush 清空所有 并删除表中的session数据
#清除session
def del_session(req):
# req.session.flush() #清除所有session
return HttpResponse('清除session')
logout 清空所有 并删除表中的session数据
from django.contrib.auth import logout
#清除session
def del_session(req):
logout(req) ##清除所有session
return HttpResponse('清除session')
del 删除某一个session值
#清除session
def del_session(req):
del req.session['name']
return HttpResponse('清除session')
(7) 设置session的保存位置
1) 默认保存在数据库的 django_session表中
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
2) 保存在内存中 cache
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
3) 保存在内存和表中
先去内存中查找 如果不存在则去表中查找 效率高 安全性高
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
4) 使用redis缓存 session
安装:
pip3 install django-redis-sessions
配置settings.py
#使用redis缓存session
SESSION_ENGINE = 'redis_sessions.session' #redis存储session
SESSION_REDIS_HOST = '127.0.0.1' #主机
SESSION_REDIS_PORT = '6379' #端口
SESSION_REDIS_DB = 0 #选择数据库
(8) session的全局配置
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_AGE = 1209600 #设置cookie存活时间 设置session的存活时间
(9) session常用的操作
#设置获取删除session
request.session[key] = value
request.session.get(key)
request.session.clear()
request.session.flush()
logout(request)
del request.session[key]
#session其它操作
req.session.keys()
req.session.values()
req.session.items()
#获取session key的值
req.session.session_key
九、使用session登录实例
from django.shortcuts import render,HttpResponse,redirect,reverse
#登录
def login(req):
# return HttpResponse('login')
return render(req,'login.html')
#登录处理
def dologin(req):
username = req.POST.get('username')
userpass = req.POST.get('userpass')
if username=='zhangsan' and userpass=='123456':
req.session['uid'] = 1
req.session['username'] = username
return redirect(reverse('App:index'))
return redirect(reverse('App:login'))
#退出登录
def logout(req):
req.session.flush()
return HttpResponse("<meta http-equiv='refresh' content='4;/'>退出成功4秒后条到首页 如不能跳到首页 请手动点击<a href='/'>首页</a>")
评论 (0)