作用
视图接收web请求,并响应web请求
本质上视图就是一个python中的函数
过程
1、用户在浏览器中输入网址
2、django获取网址信息,去除ip和端口,获得虚拟路径和文件名
3、将虚拟路径与文件名传给url管理器,管理器逐个匹配url并记住视图函数名
4、去视图中执行相应的视图函数,视图函数将相应的数据传给浏览器
urls的配置
配置根级url配置文件:setting.py中的ROOT_URLCONF,默认已经配置实现
urlpatterns:是一个url实例的列表,里面存有多个url对象
url对象的格式:正则表达式、视图名称、别名
url匹配正则的注意事项:
1、如果想要从url中获取一个值,需要对正则加小括号
2、匹配正则前方不需要加反斜杠,一般是在根级urls中的后面添加反斜杠
3、正则前需要加r表示字符串不转义
引入其他url配置,在应用中创建urls.py文件,定义本应用的url,在站点urls.py文件中使用include(),让每个应用的url在自己下面完成
url方向解析
如果在视图中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址(使用硬链接方便以后url发生改变时,不用去视图和html中的链接)
在使用链接时.通过url配置的名称,动态的生成url地址
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'blog/', include('app.urls',namespace='blog')),
url(r'backweb/', include('backweb.urls',namespace='backweb'))
]
urlpatterns = [
url(r'index',views.index,name='index')
]
视图函数
定义视图:
1、本质上视图就是一个函数
2、参数:第一个参数是HtppRequest的实例(request名字不限定默认使用request,也叫请求对象,是浏览器发送回来的,包括的浏览器发过来的所有内容),后面的参数是加括号的正则表达式获取的参数
3、一般在views文件下定义(也可以自己建立views1.py之类的文件,但是不推荐使用)
错误视图
404视图:找不到网页时(url匹配不成功)返回
配置settings.py:
DEBUG --- 为Ture则永远不会调用404页面
ALLOWED_HOSTS=[*] --- 为*代表允许所有人访问
500视图:在试图代码中出现错误代码
400视图:错误出现在客户的操作(例如服务器发现爬虫,发现错误的cookie等)
HttpRequest对象
概述:
1、服务器接收http请求后,会根据报文创建HttpRequest对象(既是视图函数的第一个参数可以,名字可以自己定,约定俗成的是request)
2、视图的第一个参数就是HttpRequest对象
3、django创建的,之后调用视图函数时传递给视图
4、可以返回任意字符串
属性:
1、path --- 请求的完整路径(不包括域名和端口,虚拟路径和文件名)
2、method --- 请求的方式,常用的有GET、POST
3、encoding --- 表示浏览器提交的数据的编码方式,一般为utf-8
4、GET --- 类似于字典的对象,包含了get的请求的所有参数
5、POST --- 类似于字典的对象,包含了post的所有参数
6、FILES --- 类似于字典的对象,包含了所有上传的文件
7、COOKIES --- 字典,包含所有的cookie
8、session --- 类似字典的对象,表示当前会话
方法:
is_ajax() --- 如果是通过XMLHttpRequest发起的,返回Ture
QuertyDict对象 --- request对象中的GET、POST都属于Quertdict对象
方法:
get() --- 可以根据键获取值,只能获取一个值
格式:request.GET.get(键)
getlist() --- 将键的值以列表的形式返回,可以获取多个值
格式:request.GET.getlist(键)
www.baidu.com/abc/a=1&b=2 --- 用get()获取 --- 如果获取到两个a则报500错误
www.baidu.com/abc/a=1&a=2&a=3 --- 用getlist()获取
GET属性 --- 获取浏览器传递给服务器的数据
POST属性 ---
使用表单提交实现post请求
request.POST.get('name') --- 获取表单中name为'name'的值
如果提交的是复选框,则需要使用geytlist方法
HttpResponse对象
作用:给浏览器返回数据
HtppRequest对象由django创建的,HttpResponse对象由程序员创建
返回用法:
1、不调用模板,直接返回数据
return HttpResponse("post")
2、调用模板 --- render
render:redner(request,templiaeName[,context])
作用:结合数据和模板,返回完整的HTML页面
参数:
request --- 请求体对象
templiaeName --- 模板的路径
context --- 传递给需要渲染在模板上的数据
return render(request,'myApp/index.html',{'aa':aa})
属性:
context --- 表示返回的内容和类型
charset --- 编码格式
status_code --- 相应状态码(200,304,404)
content-type --- 指定输出的MIME类型
实例:
res = HttpResponse --- 创建一个HttpResponse
re.context
方法:
init --- 使用页面内容实例化HttpResponse对象
write(content) --- 以文件的形式写入
flush() --- 以文件的形式输出缓冲区
set_cookie(key,value,max_Age=None, exprise=None) --- 设置cookie
res = HttpResponse
cookie = res.set_cookie('name','good') --- 创建cookie
cookie = request.COOKIES --- 获取cookie
res.write('<h1>' + cookie['name'] + '</h1>') --- 将cookie写入浏览器
delete_cookie(key) --- 删除cookie,如果删除一个不存在的key就当什么都没发生
子类HttpResponseRedirect --- 功能,重定向(服务器的跳转)
return HttpResponseRedirect('/sunck/redirect2') --- 跳转到相应的URL
简写redirect(to)
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirect1(request):
# return HttpResponseRedirect('/app/redirect2')
return redirect('/app/redirect2')
def redirect2(request):
return HttpResponse("我是重定向后的视图")
子类JsonResponse ---返回json数据,一般用于异步请求
当前端ajax请求数据类型为json时可以使用jsonResponse返回数据,也可以使用json模块将数据转换成json数据。
resp = '请求成功re'
return HttpResponse(json.dumps(resp))
状态保持
http协议时是无状态的,每次请求都是一次新的请求,不记得以前的请求
实现状态的保持,在客户端或者服务器存储有关会话的数据
cookie --- 所有的数据存储在客户端,不存敏感的数据
session --- 所有的数据存储在服务器,在客户端用cookie存储session_id
状态保持的目的 --- 在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
注意:不用的请求者之间不会共享,一对一
启用session --- 在settings.py文件中
INSTALLED_APPS --- 'django.contrib.sessions',
MIDDLEWARE --- 'django.contrib.sessions.middleware.SessionMiddleware',
启用后,每个HttpRequest对象都有一个session,类似一个字典的对象
get(key,default=None) --- 根据键获取session值,第二个参数是当查找为空时,返回none,可以自己设置参数
username = request.session.get('name','游客')
username = request.POST.get('username')
resquest.sesion['name'] =username --- 存储session
clear() --- 清空当前的会话并删除会话的cookie
flush --- 删除当前的会话并删除会话的cookie
session的使用
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 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,默认修改之后才保存(默认)
b. 使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']
# 如果del删除以后数据还是没有同步到数库,可以告知服务器数据已经发生改变,请求同步
del request.session[cart_id]
request.session.modified = True
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.clear()
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
注意:
在django的session表中,只有当发生字典赋值或者删除的情况才会将数据同步到数据表中。
单纯的修改字典的值是不会判定为修改的,在修改值以后,需要执行request.session['键'] = 值的代码才会保存到数据表中
如果执行上述以后还是不能讲数据同步到数据库,可以使用quest.session.modified = True告知服务器数据已经发生改变