• 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
    edis-2.4.5。
    打开一个cmd窗口,使用cd命令切换到指定目录(D:dev
    edis-2.4.5)运行 redis-server.exe redis.conf
    重新打开一个cmd窗口,使用cd命令切换到指定目录(D:dev
    edis-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'
     }
    '''
  • 相关阅读:
    AspNetPager.dll 分页控件使用方法、含有代码示例 [转]
    XmlDocument序列化到Session[转]
    静态构造函数
    错误日志[常用方法]
    Vss 源代码管理中的目录问题
    StopWatch 获得更精确的运行时间
    最近写的一个验证码.
    windowsservice 中的 currentdirectory
    vs2005常用快捷键(转贴)
    一个mapyEasy 图片切割工具 及源码
  • 原文地址:https://www.cnblogs.com/weilaibuxiangshuo/p/10388711.html
Copyright © 2020-2023  润新知