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\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' } '''