视图的基本操作-views-controller
1. 概述
- 作用:视图接受web请求,并响应web请求
- 本质:视图就是一个python中的函数
- 响应的内容:网页(重定向,错误视图(404,500)),JSON数据
- 响应的过程:
2. URL配置
- 配置流程:
指定根级url配置文件:Setting文件中的,如下:默认已经写好了
ROOT_URLCONF = 'project.urls'
-
urlpatterns:
一个url实例的列表
url对象:正则表达式,视图名称,名称 -
url匹配正则的注意事项:
如果想要从url中获取一个值,需要对正则加小括号
匹配正则前方不需要加’/’
正则前需要加r表示字符串不转义 -
引入其他url配置
在应用中创建urls.py文件,定义本应用的url配置;在工程urls.py文件中使用include()方法
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myApp.urls', namespace="myApp")),
]
from . import views
#myApp
urlpatterns = [
url(r'^$', views.index, name = "index"), #跳入views的index方法进行执行,跳转
url(r'^students/$', views.students),
url(r'^students2/$', views.students2),
url(r'^addstudent/$', views.addstudent),
url(r'^addstudent2/$', views.addstudent),
]
- 反向解析
概述:如果在视图,模板中使用了硬编码连接,在url配置发生变化时,动态生成连接的地址
解决:在使用连接时,通过url配置的名称,动态生成url地址
作用:使用url模板
3. 视图函数
3.1 定义视图
- 本质:一个函数
- 视图参数:
一个HttpRequest的实例
通过正则表达式获取的参数 - 位置
一般在views.py文件下定义
3.2 错误视图
- 404视图:找不到网页(url匹配不成功)时返回
在templates目录定义404.html
request_path:导致错误的网址
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404页面</title>
</head>
<body>
<h1>页面丢失</h1>
<h1>{{request_path}}</h1>
</body>
</html>
配置settings.py:
DEBUG:如果为True永远不会调用404.html网页
ALLOWED_HOST=[’*’]
- 500视图:在视图代码中出现错误(服务器代码)
- 400视图:错误出现在客户的操作
4. HttpRequest对象
4.1 概述
- 服务器接受http请求后,会根据报文创建HttpRequest对象;
- 视图的第一个参数就是HttpRequest对象;
- django创建的,之后调用视图时传递给视图
4.2 属性
- path
请求的完整路径(不包括域名和端口) - method
表示请求的方式,常用的有GET, POST - encoding
表示浏览器提交的数据的编码方式;一般为utf-8 - GET
类似于字典的对象,包含了get请求的所有参数 - POST
类似字典的对象,包含了post的所有参数 - FILES
类似字典的对象,包含了所有上传的文件 - COOKIES
字典,包含所有的cookie - session
类似字典的对象,表示当前的对话
4.3 方法
is_ajax()
如果是通过XMLHttpRequest发起的,返回True
4.4 QuertDict对象
- request对象中的GET、POST都数据QueryDict对象
- 方法
get():作用,根据键获取值,只能获取一个值;www.sunck.wang/abc?a=1&b=2&c=3
getlist():将键的值以列表的形式返回,可以获取多个值;www.sunck.wang/abc?a=1&b=2&c=3
4.5 GET属性
获取浏览器传递过来给服务器的数据
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^sunck/', include('myApp.urls', namespace="myApp")),
]
url(r'^get1', views.get1),
url(r'^get2', views.get2),
#获取get传递的数据
def get1(request):
a = request.GET.get('a')
b = request.GET['b']
c = request.GET.get('c')
return HttpResponse(a + " " + b + " " + c)
def get2(request):
a = request.GET.getlist('a')
a1 = a[0]
a2 = a[1]
c = request.GET['c']
return HttpResponse(a1 + " " + a2 + " " + c)
http://127.0.0.1:8000/sunck/get1?a=1&b=2&c=3
http://127.0.0.1:8000/sunck/get2?a=1&a=2&c=3
4.6 POST属性
使用表单提交数据
注释掉setting里面的,如下:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
注册的html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="regist/" method="post">
姓名:<input type = "text" name = "name" value=""/>
<hr/>
性别:<input type = "radio" name = "gender" value="1"/>男
性别:<input type = "radio" name = "gender" value="0"/>女
<hr/>
年龄:<input type = "text" name = "age" value=""/>
<hr/>
爱好:<input type = "checkbox" name = "hobby" value="power"/>权利
<input type = "checkbox" name = "hobby" value="money"/>金钱
<input type = "checkbox" name = "hobby" value="boy"/>美男
<input type = "checkbox" name = "hobby" value="girl"/>美女
<hr/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
url:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name = "index"), #跳入views的index方法进行执行,跳转
url(r'^attribles/$', views.attribles),
url(r'^get1/$', views.get1),
url(r'^get2/$', views.get2),
url(r'^showregist/$', views.showregist),
url(r'showregist/regist/$', views.regist),
]
views.py
#POST
def showregist(request):
return render(request, 'myApp/regist.html')
def regist(request):
name = request.POST.get("name")
gender = request.POST.get("gender")
age = request.POST.get("age")
hobby = request.POST.getlist("hobby")
print(name)
print(gender)
print(age)
print(hobby)
return HttpResponse("dsdf")
5. HttpResponse对象
5.1 概述
- 作用:给浏览器返回数据
- HttpRequest对象是由django创建的,HttpResponse对象有程序员创建
5.2 返回数据的用法
- 不调用模板,直接返回数据
from django.http import HttpResponse
def index(request):
return HttpResponse("sunck is a good man")
- 调用模板:使用render方法
原型:render(request, templateName[, context])
作用:结合数据和模板,返回完整的HTML页面
参数:
request:请求体对象
templateName:模板路径
context:传递给需要渲染在模板上的数据
示例:
def index(request):
return render(request, 'myApp/index.html")
5.3 属性
5.3.1 content
表示返回的内容
5.3.2 charset
编码格式
5.3.3 status_code
响应状态码:200,304,404等
5.3.4 content-type
指定输出的MIME类型
5.4 方法
-
init
使用页面内容实例化HttpResponse对象 -
write(content)
以文件的形式写入 -
flush()
以文件的形输出缓冲区 -
set_cookie(key, value=’’, max_age=None, exprise=None)
-
delete_cookie(key)
删除cookie;
如果删除了一个不存在的cookie,就当没发生过
5.4 子类HttpResponseRedirect
功能:可以重定向(服务器端跳转)
#重定向
from django.http import HttpResponseRedirect
def redirct1(request):
return HttpResponseRedirect('/sunck/redirct2')
def redirct2(request):
return HttpResponse("我是重定向后的视图")
简写:
redirect(to)
to推荐使用方向解析
#重定向
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirct1(request):
# return HttpResponseRedirect('/sunck/redirct2')
return redirect('/sunck/redirct2')
def redirct2(request):
return HttpResponse("我是重定向后的视图")
5.5 子类JsonResponse
返回Json数据,一般用于异步请求
init(self, data)
data:字典对象
注意:Content-type类型为application/json
6. 状态保持
6.1 概述
http协议是无状态的,每次请求都是一次新的请求,不记得以前的请求
客户端与服务器端的一次通信就是一次会话
实现状态保持,在客户端或者服务端存储有关会话的数据
存储的方式:
cookie:所有的数据存储在客户端,不要存储敏感的数据
session:所有的数据存储在服务端,在客户端用cookie存储session_id
状态保持的目的:在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
注意:不同的请求者之间不会共享这个数据,与请求者一一对应的
6.2 启用session
settings文件中,有下面两处地方:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', #默认启用了session
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', #默认启用了session
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
6.3 使用session
启用session后,每个HttpRequest对都有一个session属性,它就是一个类似字典的对象
get(key, default=None):根据键获取session值
clear():清空所有的会话
flush():删除当前的会话并删除会话的cookie
#首页
def main(request):
#取session
username = request.session.get('name','游客') #如果没有取出来name的数值,则为后面的”游客“
return render(request, 'myApp/main.html', {
'username':username
})
def login(request):
return render(request, 'myApp/login.html')
def showmain(request):
username = request.POST.get('username')
#存储session
request.session['name'] = username
return redirect('/sunck/main')
<body>
<h1>欢迎:{{username}}</h1>
<a href="/sunck/login">登陆</a>
</body>
遇到的坑人问题:url一定要记得写 ^
退出登录(清除session),三种方式,推荐使用第一种
from django.contrib.auth import logout
def quit(request):
#清除session
logout(request) #方式1
# request.session.clear() #方式2
# request.session.flush() #方式3
return redirect('/sunck/main')
session不是永久的,一般默认是半个月;
6.4 设置session的过期时间
- set_expiry(value)
- 如果不设置,两个星期后过期
- 整数,如果是10表示10秒后过期(hhh)
request.session['name'] = username
request.session.set_expiry(10) #设置session的有效时间
- 时间对象
- 0:关闭浏览器时失效
- None:永不过期
6.5 存储session的位置
待补充
- 数据库
默认存储在数据库中
SESSION_ENGINE=‘django.contrib.session.a’ - 缓存
只存储在本地内存中,如果丢失不能找回,比数据库快
SESSION_ENGINT=‘django.contrib.session.ba’ - 数据库和缓存
优先从本地缓存中读取,读取不到再去数据库中获取
SESSION_ENGINT=‘django.contrib.session.’
6.6 使用redis缓存session
使用的redis版本是:redis64-2.8.2101
在终端输入下面命令进行安装:
pip install django-redis-sessions
然后添加settings文件如下内容:
SESSION_ENGINE=‘redis_session.session'
SESSION_REDIS_HOST = ’localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ‘123456'
SESSION_REDIS_PREFIX = 'session'