django潜行之路2---视图

一 视图概念

1.视图的作用
接受用户请求 并响应给用户

2.视图函数本质
python函数

3.视图的响应

  • 网页

    • 重定向
    • 其他响应状态
      • 404 NOT_FOUND
      • 500 SERVER_ERROR
      • 400 BAD_REQUEST
  • json数据

二 url配置

  1. 路由:
    处理url地址与视图之间的程序,称之为路由

  2. 配置
    制定根级的url(django帮我们创建好了)
    在这里插入图片描述
    urlspatterns列表
    请求:

  • 一旦生成url页面请求,请求传递到urls.py;
  • Django去urlpatterns中匹配链接(Django会在匹配到的第一个就停下来);
  • 一旦匹配成功,就会去执行,path后面的方法,Django便会给出相应的view页面(该页面可以为一个Python的函数,或者基于view(Django内置的)的类),也就是用户看到的页面;
  • 若匹配失败,则出现错误的页面。

views中的简单函数

#urls.py
    from app import views #这里的app是你自己的应用的名字
    from django.urls import path
    urlpatterns = [
                path('index/', views.index, name='index'),
    ]

该方法对应view.py中的函数为:

#views.py
def index(request):
    ...
    return render(request,'index.html')

从views中继承的类

#urls.py
    from app.views import LoginView
    from django.urls import path
    urlpatterns = [
                path('login/', LoginView.as_view(), name='login'),
    ]

该方法对应的view.py中为:

#views.py
class LoginView(View):
    #请求为get时
    def get(self,request):
        ...
        return render(request, 'login.html')
    #请求为post时
    def post(self,request):
        ...
        return render(request,'login.html')

当你从其他地方比如你的应用中也新建了一个文件叫urls.py,这是可以用第三种方法:

导入其他的URL文件(适用于urls.py文件不止一个时)

 #urls.py(系统默认的)
    from django.urls import include, path
    urlpatterns = [
        path('login/', include('app.urls'))#假设自己新建的urls在app(应用中)
    ]

正则匹配url
更改导包from django.urls import re_path

urlpatterns = [
                re_path(r'^articles/(?P<year>[0-9]{4})/$', view.year, name='article'),
                re_path(r'^blog/(page-(d+)/)?$',blog_articles),
     ] 

另外:

#urls.py
    from app.views import LoginView
    from django.conf.urls import url  #注意这里
    urlpatterns = [
                url(r'^login/$', LoginView.as_view(), name='login'), #还有这里
    ]

url方法参数:

  • regex 正则
  • vivew 视图
  • name 给当前url起名

在这里插入图片描述
实例:
首页路由
在这里插入图片描述
正则访问路由200访问成功所以建议使用这种:

url(r'^test/$', vivews.test, name='test') # 这样才能严谨访问地址
  1. 新建urls.py
    因为我们知道一个project下可以有多个App所以建议每个app下新建一个处理当前App所有的urls.py文件
    App下新建
    在这里插入图片描述
    project下urls.py代码:
    在这里插入图片描述

  2. 无参路由
    不带参数的路由地址 以上路由都是不带参数路由

  3. 带一个参数的路由地址
    在这里插入图片描述
    设置只带2-3长度的字符
    访问:127.0.0.1:8000/arg/add 127.0.0.1:8000/arg/哈哈
    在这里插入图片描述

  4. 带多个参数
    路由地址
    在这里插入图片描述
    视图
    在这里插入图片描述

访问127.0.0.1:8000/小花/18/
注意:

  • 路由地址结尾/建议都加上和flask- -样如果访问了以/作为结尾的路由地址那么访问的时候结尾的/是否添加
    都无所谓只是会多一- -个301重定向但是如果结尾的/在定制的时候就不添加则访问的时候也不能存在否则404
  • 一个视图函数可以有多个路由地址但足路由的name值不能相同
  • 路由地址带参需要使用()进行参数值的存储
  • 路由地址在接收到传参以后都会转换成str类型所以你需要在接收到参数值以后进行转换成对应你要的类型

三 反向解析

概述:
如果模板中的连接或使用的url为硬链接 则路由地址一旦发生改变,所有的地址都需要改变,增加了后期的维护
所以所有的路由地址都要动态生成(反向解析)减轻后期维护
作用域:
模板中/视图函数中
模板中
在这里插入图片描述
路由地址:
在这里插入图片描述
视图函数为上面带一个或多个参数的视图
注意
其中App为namespace的值 name为url方法的name值

四 request对象

  1. request对象

九 session

session存储
将数据存在服务器中访问第一次会在cookie 建立一个唯一的ID号这样访问者服务器将自动包含ID服务器来区分访问者
(1)开启session:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App',
]
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',
]

(2)session
启用session后 每个request请求都用有一个seesion属性

(3)设置session
生成session存储所需要的session表
python.manage.py migrate
在这里插入图片描述
实例:(session是用base64加密的)

from django.contrib.auth import logout
from django.shortcuts import HttpResponse


# 设置session, 默认14天
def set_session(req):
    req.session['name'] = 'xiaole'
    return HttpResponse('设置session')


# 设置session并设置过期时间
def life_session(req):
    req.session.set_expiry(60)# 60秒
    req.session.set_expiry(0)# 会话结束后
    req.session['name'] = 'xiale'
    return HttpResponse('设置session过期时间')


# 获取session
def get_session(req):
    var = req.session.get('name')
    return HttpResponse('获取session:{}'.format(var))


"""
1.clear 清除所有session 会清除session数据 不会删除一条的所有
2.flush 清除所有session 会清除session数据
3.logout 清除所有session 会清除session数据
4.del.req.session['key]的值
"""


def del_cookie(req):
    res = HttpResponse('删除')
    res.delete_cookie('name')

    req.session.clear()
    req.session.flush()
    logout(req)
    del req.session['name']
    return res
**存储位置**
settings.py
#1. 设置将session存储在数据库中
SESSION_ENGINE = 'django.contrib.session.backends.db'
#2. 设置将session存储在内存中
SESSION_ENGINE = 'django.contrib.session.backends.cache'
#3. 设置保存在数据库和内存中 
SESSION_ENGINE = 'django.contrib.session.backends.cache_db'
#4. 设置存储在redis中
#4. 配置缓存在redis中
SESSION_ENGINE = 'redis_session.session'
SESSION_REDIS_HOST = '127.0.0.1'
SESSION_REDIS_PORT = '6379'
SESSION_REDIS_DB = 0

session的全局变量
SESSION_COOKIE_NAME = ‘sessionid’ #session’的id值存储在cookie上的名称
SESSION_COOKIE_AGE = 1209600 #默认失效时间2周

session常用操作
在这里插入图片描述

作业:使用session完成登录操作

爱,就是你和某个人一起经历的一切。
原文地址:https://www.cnblogs.com/afly-8/p/13561128.html