"""
--视图概述:--
作用:视图接受WEB请求,并响应WEB请求
本质:视图就是一个python中的函数
响应:
1.网页:
一、重定向
二、错误视图 400,500
2.json数据:
过程: --url配置--
配置流程:
一、指定根级url配置文件:在Setting.py文件中 ROOT_URLCONF = 'xindjago.urls'
二、urlpatterns:
1.一个url实例的列表
2.url对象:正则表达式---视图名称----名称
三、url匹配正则的注意事项:
1.如果想要从url获取一个值,需要对正则加()小括号
2.匹配正则前方不需要加反斜杠例:url(r'^students/$',views.index)即r'^后面不需要加/
3.正则前需要加r,表示字符串不转义 --引入其它url配置--
在应用中创建urls.py文件,定义本应用的url配置,在工程文件urls.py文件中配置include()方法例:
主:
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('xinapp.urls')),
#url(r'^',include('xinapp.urls',namespace="xinapp")), #这是另外一种方法URL反向解析用
] app中的urls.py配置
from django.conf.urls import url
from . import views
app_name = 'xinapp' #如果使用URL反向解析必须在应用的URLS中定义一个app_name,值为templates中项目的名称
urlpatterns = [
url(r'^$',views.index)
#url(r'^$',views.index,name="index") #URL反向解析用
] --URL的反向解析--
概述:如果在视图,模版中使用了硬编码,在url配置发生改变时,动态生成链接地址就是上同的 namespace 此命令
解析:在使用链接时,通过URL配置的名称,动态生成url地址
作用:1.使用URL模版 --视图函数--
一.定义视图:
1.本质:一个参数
2.视图参数:一个HttpRequest实例(request),通过正则表达式获取参数即加括号()
3.位置:一般在views.py中定义(也可以定义其它文件名,但DJANGO一般建议使用VIEWS.PY定义) --错误视图---:
一、404视图:在找不到网页时(url配置不成功时)返回
位置:在templates目录下定义404.html(注意千万不能放到templates目录下面app应用的目录下,只能放templates目录)
1.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404页面</title>
</head>
<body>
<h1>页面丢失</h1>
<h2>{{ request_path }}</h2>
</body>
</html>
2.{{ request_path }} 导致错误的网址
3.写完后,需要配置setting.py
1.DEBUG 如果为True,永远不会调用404.html,要设置为False
2.ALLOWED_HOSTS = [] 设置为:ALLOWED_HOSTS = ['*']
二、500视图:在视图代码中出现错误(服务器代码)
三、400视图:错误出现在客服的操作 --HttpRequest对象--
概述:
1.服务器接收http请求后,会根据报文创建HttpRequest对象
2.视图的第一个参数就是HttpRequest对象
3.djago创建之后调用试图时传递给视图
属性:(这些都是字符串类型)
path:请求的完整路径(不包括域名和端口)
method:表示请求方式,常用的有GET,POST
encoding:表示浏览器提交的数据的编码方式,一般为UTF-8
GET:类似字典的对象,包含了get请求的所有参数
POST:类似字典的对象,包含了post请求的所有参数
FILES:类似字典的对象,包含了所有上传文件
COOKIES:就是一个字典,包含所有cookies
session:类似字典的对象,表示当前的会话
方法:
1. is_ajax() 如果是通过XMLHttpRequest发起的,返回True
QueryDict对象:
1.request对象中的GET,POST都属于QueryDict对象
2.方法:
get()
作用:根据键获取值,只能获取一个值
www.xinapp.com/abc?a=1&b=2&c=3
getlist()
作用:将键的值以列表的形式返回,可以获取多个值
www.xinapp.com/abc?a=1&a=2&c=3 GET属性:(获取浏览器传递给服务器的数据)
1.http://127.0.0.1:8000/suck/get1?a=1&b=2&c=3
举例:
def get1(request):
a = request.GET.get('a')
b = request.GET['b']
c = request.GET.get('c')
return HttpResponse(a +" "+ b+" " + c)
2.http://127.0.0.1:8000/suck/get2?a=1&a=2&c=3
举例:
def get2(request):
a = request.GET.getlist('a')
a1= a[0]
a2= a[1]
c = request.GET.get('c')
return HttpResponse(a1 +" "+ a2 +" "+ c) POST属性:
1.使用表单提交POST请求
2.在setting中,关闭CSRF
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', 3.使用POST实现表单提交
#展示表单
def showregist(request):
return render(request,'xinapp/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("ok") --HttpResponse对象--
概述:
1.作用:给浏览器返回数据
2.HttpRequest是由Django创建,HttpResponse是由用户创建的
返回用法:
1.不调用模版,直接返回数据
from django.http import HttpResponse
def index(reqeust):
return HttpResponse("Ok")
2.调用模版,再返回数据,使用render方法
原型:render(request,templateName[,context])
作用:结合数据和模版,返回一个完整的HTML页面
参数:
request 请求体对象
templateName 模版路径
context(可选项) 传递给需要渲染在模版上的数据
示例:
def showregist(request):
return render(request,'xinapp/regist.html') 属性
1.content 返回内容的内容
2.charset 返回数据的编码格式
3.status_code 响应的状态码 200,304,404
4.content-type 指定输出的MIME类型
示例:
#response属性展示
def showresponse(request):
res = HttpResponse()
res.content = b'good'
print(res.content)
print(res.charset)
print(res.status_code)
print(res.content-type)
return res 方法
int 使用页面的内容实例化HttpResponse对象
write(content) 以文件的形式写入
flush 以文件的形式输了缓存冲区
set_cookie(key,value='',max_age=None,exprise=None) 设置cookies
delete_cookie(key) 删除cookie(注意,如果删除一个不存在的Key,就当什么都没有发生)
举例
def cookiestext(request):
res = HttpResponse()
# cookie = res.set_cookie("suck","good") #创建cookies值
cookie = request.COOKIES #把之前COOKIES值赋值给变量
res.write("<h1>"+cookie["suck"]+"</h1>") #把COOKIES值取出来
return res 子类HttpResponseRedirect
1.功能:重定向,服务器端的跳转
举例1:
from django.http import HttpResponse,HttpResponseRedirect
def index(request):
#好多数据库的操作,只需要使用一条重定向就可以
return render(request,'xinapp/index.html')
def index1(request):
return HttpResponseRedirect('/suck')
举例2:
#重定向
from django.http import HttpResponse,HttpResponseRedirect
def redirect1(request):
return HttpResponseRedirect('/suck/redirect2')
def redirect2(request):
return HttpResponse('我是重定向后的视图') 2.简写 redirect(to)
举例:
from django.shortcuts import redirect
from django.http import HttpResponseRedirect
#重定向
def redirect1(request):
# return HttpResponseRedirect('/suck/redirect2')
return redirect('/suck/redirect2')
def redirect2(request):
return HttpResponse('我是重定向后的视图') 3.to推荐使用反向解析 子类JSonResponse
1. 返回json数据,一般用于异步请求
2. __init__(self,data)
3. data 字典对象
4. 注意:Content-type类型application/json 状态保持
概述:
1.http协议是无状态,每次请求都是一次新的请求,不记得之前的请求
2.客户端与服务器的一次通信就是一次会话
3.实现状态保持,在客户端或者服务端存储会话的数据
4.存储方式
一、cookies
它是所有数据都存储在客户端,如果要存储也是可以不要存储敏感的数据,不安全
二、session
所有数据都存储在服务端,在客户端用COOKIES存储session_id
5.状态保持的目的
在一段的时间内,跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
6.注意
不同的请求者之间是不会共享这个数据,与请求者是一一对应的 启用session
1.在setting文件中的 INSTALLED_APPS 里面:django.contrib.sessions,默认是启用的
2.在setting文件中的 MIDDLEWARE 里面:django.contrib.sessions.middleware.SessionMiddleware,默认也是启用 使用session
1.启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字典的对象
2.方法get(key,default=None) 根据键获取值
3.clear() 清空所有会话
4.flush() 删除当前的会话并删除会话的cookies
5.logout(request) 直接从from django.contrib.auth import logout 推荐使用此方法
示例
def main(request):
# 取session值
username1 = request.session.get('name','游客')
print(username1)
return render(request,'xinapp/main.html',{'username':username1}) def login(request):
return render(request,'xinapp/login.html') def showmain(request):
username= request.POST.get('username')
#存储session
print(username)
request.session["name"] = username
return redirect('/suck/main/') from django.contrib.auth import logout
def quit(request):
#清除session
logout(request) # 以下三个多是,推荐使用logout清除session
# request.session.clear()
# request.session.flush()
return redirect('/suck/main/') 设置session过期时间
1.set_expiry(value)
2.如果不设置,15天后会过期
3.它是一个整数,value值如果为10,即10秒:request.session.set_expiry(10)
4.时间对象
5. 0(数字零) 关闭浏览器时失效
6. None 永不过期 存储session的位置
1.数据库:默认存储在数据库中
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
2.缓存:只储存在本地内存中,如果丢失不能找回,比数据库快
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
3.数据库和缓存:优先从本地缓存中读取,读取不到再去数据库中获取
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db’
举例:
配置 settings.py,放在最后
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) ---使用redis缓存session---
一、第一步
WINDOWS环境下(linux可以直拉使用源安装),需要安装redis程序,才使用第二步进行操作
windows下安装redis:
下载地址https://github.com/dmajkic/redis/downloads。下载到的Redis支持32bit和64bit。根据自己实际情况选择,我选择32bit。把32bit文件内容拷贝到需要安装的目录下,比如:D:\dev\redis-2.4.5。
打开一个cmd窗口,使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行 redis-server.exe redis.conf
重新打开一个cmd窗口,使用cd命令切换到指定目录(D:\dev\redis-2.4.5)运行 redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口,123456是redis密码 如修改redis密码:
输入 redis-cli.exe -h 172.16.1.114 -p 6379
输入 config get requirepass --获取所有密码
输入 config set requirepass password --password为密码
此时需要认证 auth password
下次登录直接输入 redis-cli.exe -h 172.16.1.114 -p 6379 -a password --启动成功 二、第二步
1.在Django安装session
pip install djago-redis-sessions
2.在setting中最底下添加此段代码
使用redis保存session数据
第一种:(注意,如果改密码必须重启redis服务,否则会报错)
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 4
SESSION_REDIS_PASSWORD = 'weilai'
SESSION_REDIS_PREFIX = 'session' 第二种:字典方式,改密码后不需要重启redis服务即可马上生效使用
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host': 'localhost',
'port': 6379,
'db': 0,
'password': 'weilai',
'prefix': 'session'
}
'''