django url配置-反向解析-视图函数-HttpRequest对象-HttpResponse对象-cookies-session-redis缓存session

"""
--视图概述:--
作用:视图接受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
edis-2.4.5。
打开一个cmd窗口,使用cd命令切换到指定目录(D:dev
edis-2.4.5)运行 redis-server.exe redis.conf
重新打开一个cmd窗口,使用cd命令切换到指定目录(D:dev
edis-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'
 }
'''