• Django 视图


    1. 视图的功能

    接收请求,进行处理,与M(models)和T(templates)进行交互,返回应答。

    返回html内容 HttpResponse,也可能重定向 redirect,还可以返回json数据。

    2. 视图函数使用

    2.1 使用

    1)  定义视图函数

    request参数必须有。它是一个HttpRequest类型的对象。参数名可以变化,但不要更改。

    2)  配置url

    建立url和视图函数之间的对应关系。

    2.2 url配置的过程

    1)  在项目的urls文件中包含具体应用的urls文件,在具体应用的urls文件中包含具体url和视图的对应关系。

    2)  url配置项是定义在一个名叫urlpatterns的列表中,其中的每一个元素就是一个配置项,每一个配置项都调用url函数。

    3. url匹配的过程

     

    url:http://127.0.0.1:8000/aindex?a=1

    1) 去除域名和后面的参数,剩下/aindex,再把前面的/去掉,剩下aindex

    2) 拿aindex先到项目的url.py文件中进行从上到下的匹配,匹配成功之后执行后面对应的处理动作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到应用的urls.py文件中再进行从上到下的匹配。

    3) 如果匹配成功则调用相应的视图产生内容返回给客户端。如果匹配失败则产生404错误

    请求的url被看做是一个普通的python字符串,进行匹配时不包括域名、get或post参数。 如请求地址如下:

    http://127.0.0.1:8000/delete1/?a=10
    

    1)去除掉域名和参数部分,并将最前面的/去除后,只剩下如下部分与正则匹配。

    delete1/
    

    2)打开booktest/urls.py文件,定义与这个地址匹配的url如下:

    url(r'^delete\d+/$',views.show_arg),
    

    3)在booktest/views.py中创建视图show_arg。

    def show_arg(request):
        return HttpResponse('show_arg')

    4. 错误视图

    404:找不到页面,关闭调试模式之后,默认会显示一个标准的错误页面,如果要显示自定义的页面,则需要的templates目录下面自定义一个404.html文件。

    a)  url没有配置

    b)  url配置错误

    500: 服务器端的错误。

    a)  视图出错

    网站开发完成需要关闭调试模式,在settings.py文件中:

        DEBUG=False

        ALLOWED_HOST=[ '*']

    5. 捕获url参数

    进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数。

    1)  位置参数

    位置参数,参数名可以随意指定,比如

    url(r'^delete/(\d+)$', views.delete)  # 注意把参数用括号括住

    2)  关键字参数:在位置参数的基础上给正则表达式组命名即可。

    ?P<组名>

    关键字参数,视图中参数名必须和正则表达式组名一致.    

    6. Ajax

    异步的javascript。在不全部加载某一个页面部的情况下,对页面进行局的刷新,ajax请求都在后台。

    图片,css文件,js文件都是静态文件。

    1)  发起ajax请求:jquery发起

    2)  执行相应的视图函数,返回json内容

    3)  执行相应的回调函数。通过判断json内容,进行相应处理

    <script>
    
        $('#btnLogin').click(function () {
            $.ajax({
                url: '/login_ajax_check',
                type: 'post',
                data: {
                    'username': $('#username').val(),
                    'password': $('#password').val()
                },
                dataType: 'json',
                success: function (data) {
                    if (data.ret == 0) {
                        $('#message').show().html('用户名或密码错误')
    
                    }
                    else {
                        location.href = '/index'
                    }
                }
            })
        })
    
    </script>
    def login_ajax_check(request):
        name = request.POST.get('username')
        pwd = request.POST.get('password')
    
        print(name, pwd)
        print(type(pwd))  # 原始的表单传来的是字符串
    
        if name == 'yk' and pwd == '123':  # 注意这里 密码 是字符串的格式
            return HttpResponse(json.dumps({'ret': 1}))
    
        else:
            return HttpResponse(json.dumps({'ret': 0}))

    7. 状态保持

    浏览器请求服务器是无状态的。无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

    无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议。根本原因是:浏览器与服务器是使用Socket套接字进行通信的,

    服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。

    有时需要保存下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等。 实现状态保持主要有两种方式:

    • 在客户端存储信息使用Cookie。
    • 在服务器端存储信息使用Session。

    7.1 Cookie

    cookie是由服务器生成,存储在浏览器端的一小段文本信息。

    cookie的特点:

    1)  以键值对方式进行存储。

    2)  通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。request.COOKIES

    3)  cookie是基于域名安全的。

    4)  cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。

    记住用户名案例。

    def set_cookie(request):
        '''设置cookie'''
        response = HttpResponse("设置cookie")
        # 设置一个cookie信息,名字为num,值为1 ,设置过期时间
        response.set_cookie('num', 1, max_age=7200)
    
        return response
    
    
    def get_cookie(request):
        '''获取cookie信息'''
    
        num = request.COOKIES['num']
        return HttpResponse(num)

    7.2 Session

    session存储在服务器端。

    session的特点:

    1) session是以键值对进行存储的。

    2) session依赖于cookie。唯一的标识码保存在sessionid cookie中。

    依赖于Cookie

    所有请求者的Session都会存储在服务器中,服务器如何区分请求者和Session数据的对应关系呢?

    答:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session。

    结果:如果想使用Session,浏览器必须支持Cookie,否则就无法使用Session了。

    存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

    3) session也是有过期时间,如果不指定,默认两周就会过期。

    记住用户登录状态案例。

    def set_session(request):
        '''设置session'''
        request.session['username'] = 'yk'
        request.session['age'] = 18
    
        return HttpResponse('设置session')
    
    
    def get_session(request):
        '''获取session'''
        username = request.session['username']
        age = request.session['age']
    
        return HttpResponse(username + ":" + str(age))
    
    
    def clear_session(request):
        '''清除session'''
        request.session.clear()
        return HttpResponse('清除session成功')
    def login(request):
        '''显示登录页面'''
    
        # 1、先判断用户是否登录
        if request.session.has_key('islogin'):
            return redirect('/index')
    
        else:
            # 获取cookie name
            if 'name' in request.COOKIES:
                # 获取用户名
                name = request.COOKIES['name']
            else:
                name = ''
            return render(request, 'booktest/login.html', {'name': name})
    
    
    def login_check(request):
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        remember = request.POST.get('remember')
    
        # print(name,pwd)
        # print(type(pwd))   # 原始的表单传来的是字符串
    
        if name == 'yk' and pwd == '123':  # 注意这里 密码 是字符串的格式
    
            response = redirect('/index')
            # 判断是否记住用户名
            if remember == 'on':
                response.set_cookie('name', name, 7200)
    
            # 记住用户的登录状态
            request.session['islogin'] = True
    
            return response
    
        else:
            return redirect('/login')
  • 相关阅读:
    多个ROS工作空间常见的问题
    ROS tf(现在都使用tf2了)
    ERROR: cannot launch node of type [teleop/teleop_key]: can't locate node [teleop_key] in package [teleop]
    Linux上静态库和动态库的编译和使用
    【C++】类中this指针的理解
    fatal error: No such file or directory
    g2o使用教程
    如何理解二次型
    <ROS> message_filters 对齐多种传感器数据的时间戳
    linux与C内存管理机制
  • 原文地址:https://www.cnblogs.com/ykgo/p/9332215.html
Copyright © 2020-2023  润新知