Django03_视图

1. 概述

  1. 作用:视图接受web请求,并响应web请求
  2. 本质:视图就是一个python中的函数
  3. 响应的内容:网页(重定向,错误视图(404,500)),JSON数据
  4. 响应的过程:
    在这里插入图片描述

2. URL配置

  1. 配置流程:
    指定根级url配置文件:Setting文件中的,如下:默认已经写好了
ROOT_URLCONF = 'project.urls'
  1. urlpatterns:
    一个url实例的列表
    url对象:正则表达式,视图名称,名称

  2. url匹配正则的注意事项:
    如果想要从url中获取一个值,需要对正则加小括号
    匹配正则前方不需要加’/’
    正则前需要加r表示字符串不转义

  3. 引入其他url配置
    在应用中创建urls.py文件,定义本应用的url配置;在工程urls.py文件中使用include()方法

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('myApp.urls', namespace="myApp")),
]
from . import views
#myApp
urlpatterns = [
    url(r'^$', views.index, name = "index"),  #跳入views的index方法进行执行,跳转
    url(r'^students/$', views.students),
    url(r'^students2/$', views.students2),
    url(r'^addstudent/$', views.addstudent),
    url(r'^addstudent2/$', views.addstudent),
]
  1. 反向解析
    概述:如果在视图,模板中使用了硬编码连接,在url配置发生变化时,动态生成连接的地址
    解决:在使用连接时,通过url配置的名称,动态生成url地址
    作用:使用url模板

3. 视图函数

3.1 定义视图

  1. 本质:一个函数
  2. 视图参数:
    一个HttpRequest的实例
    通过正则表达式获取的参数
  3. 位置
    一般在views.py文件下定义

3.2 错误视图

  1. 404视图:找不到网页(url匹配不成功)时返回
    在templates目录定义404.html
    request_path:导致错误的网址
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404页面</title>
</head>
<body>
    <h1>页面丢失</h1>
    <h1>{{request_path}}</h1>
</body>
</html>

配置settings.py:
DEBUG:如果为True永远不会调用404.html网页
ALLOWED_HOST=[’*’]

  1. 500视图:在视图代码中出现错误(服务器代码)
  2. 400视图:错误出现在客户的操作

4. HttpRequest对象

4.1 概述

  1. 服务器接受http请求后,会根据报文创建HttpRequest对象;
  2. 视图的第一个参数就是HttpRequest对象;
  3. django创建的,之后调用视图时传递给视图

4.2 属性

  1. path
    请求的完整路径(不包括域名和端口)
  2. method
    表示请求的方式,常用的有GET, POST
  3. encoding
    表示浏览器提交的数据的编码方式;一般为utf-8
  4. GET
    类似于字典的对象,包含了get请求的所有参数
  5. POST
    类似字典的对象,包含了post的所有参数
  6. FILES
    类似字典的对象,包含了所有上传的文件
  7. COOKIES
    字典,包含所有的cookie
  8. session
    类似字典的对象,表示当前的对话

4.3 方法

is_ajax()
如果是通过XMLHttpRequest发起的,返回True

4.4 QuertDict对象

  1. request对象中的GET、POST都数据QueryDict对象
  2. 方法
    get():作用,根据键获取值,只能获取一个值;www.sunck.wang/abc?a=1&b=2&c=3
    getlist():将键的值以列表的形式返回,可以获取多个值;www.sunck.wang/abc?a=1&b=2&c=3

4.5 GET属性

获取浏览器传递过来给服务器的数据

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^sunck/', include('myApp.urls', namespace="myApp")),
]
    url(r'^get1', views.get1),
    url(r'^get2', views.get2),
#获取get传递的数据
def get1(request):
    a = request.GET.get('a')
    b = request.GET['b']
    c = request.GET.get('c')
    return HttpResponse(a + "  " + b + "  " + c)

def get2(request):
    a = request.GET.getlist('a')
    a1 = a[0]
    a2 = a[1]
    c = request.GET['c']
    return HttpResponse(a1 + "  " + a2 + "  " + c)
http://127.0.0.1:8000/sunck/get1?a=1&b=2&c=3
http://127.0.0.1:8000/sunck/get2?a=1&a=2&c=3

4.6 POST属性

使用表单提交数据
注释掉setting里面的,如下:

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',
]

注册的html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <form action="regist/" method="post">
        姓名:<input type = "text" name = "name" value=""/>
        <hr/>
        性别:<input type = "radio" name = "gender" value="1"/>男
        性别:<input type = "radio" name = "gender" value="0"/>女
        <hr/>
        年龄:<input type = "text" name = "age" value=""/>
        <hr/>
        爱好:<input type = "checkbox" name = "hobby" value="power"/>权利
        <input type = "checkbox" name = "hobby" value="money"/>金钱
        <input type = "checkbox" name = "hobby" value="boy"/>美男
        <input type = "checkbox" name = "hobby" value="girl"/>美女
        <hr/>
        <input type="submit" value="注册"/>
    </form>
</body>
</html>

url:

from django.conf.urls import url

from . import views
urlpatterns = [
    url(r'^$', views.index, name = "index"),  #跳入views的index方法进行执行,跳转
    url(r'^attribles/$', views.attribles),
    url(r'^get1/$', views.get1),
    url(r'^get2/$', views.get2),

    url(r'^showregist/$', views.showregist),
    url(r'showregist/regist/$', views.regist),
]

views.py

#POST
def showregist(request):
    return render(request, 'myApp/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("dsdf")

在这里插入图片描述

5. HttpResponse对象

5.1 概述

  1. 作用:给浏览器返回数据
  2. HttpRequest对象是由django创建的,HttpResponse对象有程序员创建

5.2 返回数据的用法

  1. 不调用模板,直接返回数据
from django.http import HttpResponse
def index(request):
	return HttpResponse("sunck is a good man")
  1. 调用模板:使用render方法
    原型:render(request, templateName[, context])
    作用:结合数据和模板,返回完整的HTML页面
    参数:
    request:请求体对象
    templateName:模板路径
    context:传递给需要渲染在模板上的数据
    示例:
def index(request)return render(request, 'myApp/index.html")

5.3 属性

5.3.1 content

表示返回的内容

5.3.2 charset

编码格式

5.3.3 status_code

响应状态码:200,304,404等

5.3.4 content-type

指定输出的MIME类型

5.4 方法

  1. init
    使用页面内容实例化HttpResponse对象

  2. write(content)
    以文件的形式写入

  3. flush()
    以文件的形输出缓冲区

  4. set_cookie(key, value=’’, max_age=None, exprise=None)

  5. delete_cookie(key)
    删除cookie;
    如果删除了一个不存在的cookie,就当没发生过
    在这里插入图片描述

5.4 子类HttpResponseRedirect

功能:可以重定向(服务器端跳转)

#重定向
from django.http import HttpResponseRedirect
def redirct1(request):
    return HttpResponseRedirect('/sunck/redirct2')

def redirct2(request):
    return HttpResponse("我是重定向后的视图")

简写:
redirect(to)
to推荐使用方向解析

#重定向
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirct1(request):
    # return HttpResponseRedirect('/sunck/redirct2')
    return redirect('/sunck/redirct2')

def redirct2(request):
    return HttpResponse("我是重定向后的视图")

5.5 子类JsonResponse

返回Json数据,一般用于异步请求
init(self, data)
data:字典对象
注意:Content-type类型为application/json

6. 状态保持

6.1 概述

http协议是无状态的,每次请求都是一次新的请求,不记得以前的请求
客户端与服务器端的一次通信就是一次会话
实现状态保持,在客户端或者服务端存储有关会话的数据
存储的方式:
cookie:所有的数据存储在客户端,不要存储敏感的数据
session:所有的数据存储在服务端,在客户端用cookie存储session_id

状态保持的目的:在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
注意:不同的请求者之间不会共享这个数据,与请求者一一对应的

6.2 启用session

settings文件中,有下面两处地方:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',   #默认启用了session
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myApp',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',   #默认启用了session
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

6.3 使用session

启用session后,每个HttpRequest对都有一个session属性,它就是一个类似字典的对象
get(key, default=None):根据键获取session值
clear():清空所有的会话
flush():删除当前的会话并删除会话的cookie

#首页
def main(request):
    #取session
    username = request.session.get('name','游客')  #如果没有取出来name的数值,则为后面的”游客“
    return render(request, 'myApp/main.html', {
        'username':username
    })

def login(request):
    return render(request, 'myApp/login.html')

def showmain(request):
    username = request.POST.get('username')
    #存储session
    request.session['name'] = username
    return redirect('/sunck/main')
<body>
    <h1>欢迎:{{username}}</h1>
    <a href="/sunck/login">登陆</a>
</body>

在这里插入图片描述
遇到的坑人问题:url一定要记得写 ^

退出登录(清除session),三种方式,推荐使用第一种

from django.contrib.auth import logout
def quit(request):
    #清除session
    logout(request)  #方式1
    # request.session.clear()  #方式2
    # request.session.flush()  #方式3
    return redirect('/sunck/main')

在这里插入图片描述
session不是永久的,一般默认是半个月;

6.4 设置session的过期时间

  1. set_expiry(value)
  2. 如果不设置,两个星期后过期
  3. 整数,如果是10表示10秒后过期(hhh)
    request.session['name'] = username
    request.session.set_expiry(10)  #设置session的有效时间
  1. 时间对象
  2. 0:关闭浏览器时失效
  3. None:永不过期

6.5 存储session的位置

待补充

  1. 数据库
    默认存储在数据库中
    SESSION_ENGINE=‘django.contrib.session.a’
  2. 缓存
    只存储在本地内存中,如果丢失不能找回,比数据库快
    SESSION_ENGINT=‘django.contrib.session.ba’
  3. 数据库和缓存
    优先从本地缓存中读取,读取不到再去数据库中获取
    SESSION_ENGINT=‘django.contrib.session.’

6.6 使用redis缓存session

使用的redis版本是:redis64-2.8.2101
在终端输入下面命令进行安装:

pip install django-redis-sessions

然后添加settings文件如下内容:

SESSION_ENGINE=‘redis_session.session'
SESSION_REDIS_HOST = ’localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD =123456'
SESSION_REDIS_PREFIX = 'session'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值