Django视图

作用

视图接收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告知服务器数据已经发生改变
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值