zoukankan      html  css  js  c++  java
  • Django视图

    需求:开发一个用户登录功能

    1、写一个登录功能

    前端页面

    首先从前端页面开始,打开.../sign/templates/index.html,开发一个表单

    <html>
    <head>
        <title>Django Page</title>
    </head>
    <body>
    <h1>发布会管理</h1>
    <form method="post">
        <input name="username" type="text" placeholder="请输入用户名"><br>
        <input name="password" type="password" placeholder="请输入密码"><br>
        <button id="btn" type="submit">登录</button>
    </form>
    </body>
    </html>  

    启动Django服务,访问:http://127.0.0.1:8000/index/ 如图所示

    登录,弹出“CSRF verification failed. Request aborted.”,这是因为CSRF(Cross-site request forgery)跨站请求伪造,Django针对CSRF的保护措施是在生成的每个表单中放置一个自动生成的令牌,通过这个令牌判断POST请求是否来自同一个网站。这里要用到Django的“标签模板”添加CSRF令牌。

    ......
    <form method="post">
        <input name="username" type="text" placeholder="请输入用户名"><br>
        <input name="password" type="password" placeholder="请输入密码"><br>
        <button id="btn" type="submit">登录</button>
        {% csrf_token %}
    </form>
    ......

     刷新,重新登录,错误提示消失了。

    也可以注释掉CSRF请求,在../guest/settings.py中

    'django.middleware.csrf.CsrfViewMiddleware',

    处理登录请求

     1、form表单的action属性指定提交的路径。打开inde.html文件,添加如下:

    form method="post" action="/login_action/">
    

    2、添加路由,打开../guest/urls.py

    url(r'^login_action/$', views.login_action),
    

    3、添加视图,打开sign/views.py,添加login_action函数

    from django.http import HttpResponse
    from django.shortcuts import render
    
    
    # Create your views here.
    def index(request):
        return render(request, "index.html")
    
    
    def login_action(request):
        if request.method == 'POST':
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            if username == 'admin' and password == 'admin123':
                return HttpResponse('login success!')
            else:
                return render(request, 'index.html', {'error': 'username or password error!'})
    

    4、前端添加返回错误信息的地方,打开inde.html,使用Django的模板

    <form method="post" action="/login_action/">
        <input name="username" type="text" placeholder="请输入用户名"><br>
        <input name="password" type="password" placeholder="请输入密码"><br>
        {{ error }} <br>
        <button id="btn" type="submit">登录</button>
        {% csrf_token %}
    </form>
    
    {{ error }} 对应render返回的字典中的key,即“error”,登录失败页面中显示对应的value,即‘username or password error!’
    5、刷新页面,登录。

    将登录请求跳转到指定页面

    1、创建../templates/event_manage.html页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Event Manage Page</title>
    </head>
    <body>
        <h1> Login Success! </h1>
    </body>
    </html>
    

    2、修改views.py文件

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    
    
    # Create your views here.
    def index(request):
        return render(request, "index.html")
    
    
    def login_action(request):
        if request.method == 'POST':
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            if username == 'admin' and password == 'admin123':
                return HttpResponseRedirect('/event_manage/')
            else:
                return render(request, 'index.html', {'error': 'username or password error!'})
    
    
    # 发布会管理
    def event_manage(request):
        return render(request, "event_manage.html")
    
    HttpResponseRedirect类可以对路径重定向,从而将登录请求成功的请求指向/event_manage/目录
    3、添加路由
    url(r'^event_manage/$', views.event_manage),
    

    4、刷新,登录

     Cookie的使用

    修改.../sign/views.py文件:

    def login_action(request):
        if request.method == 'POST':
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            if username == 'admin' and password == 'admin123':
                response = HttpResponseRedirect('/event_manage/')
                # 添加cookie: key,value,有效期
                response.set_cookie('user', username, 3600)
                return response
            else:
                return render(request, 'index.html', {'error': 'username or password error!'})
    
    
    # 发布会管理
    def event_manage(request):
        username = request.COOKIES.get('user', '')  # 读取浏览器cookie
        return render(request, "event_manage.html", {"user": username})
    

    修改.../templates/event_manage.html页面,添加<div>标签来显示用户登录的用户名:

    <div style="float: right;">
            <a>嘿!{{ user }} 欢迎</a><hr/>
    </div>

    刷新,重新登录,如下图所示:

     session的使用

    1、修改一下代码

    修改.../sign/views.py文件,在login_action函数中,将:
    response.set_cookie('user',username,3600)
    替换为:
    request.session['user']=username #将session信息记录到浏览器
    在event_manage函数中,将:
    username=request.COOKIES.get('user','')
    替换为:
    username=request.session.get('user','') #读取浏览器session

    2、创建一个存session的数据库sqlite

    python manage.py migrate

    3、刷新,登录

    2、Django认证系统

    登录admin后台

    1、创建admin后台用户名密码:python manage.py createsuperuser

    设置用户名/密码:admin / zlm111222

    2、通过URL地址:http://127.0.0.1:8000/admin/ 来访问Django自带的Admin管理后台

     引用Django认证登录

    打开.../sign/views.py文件修改login_action函数

    def login_action(request):
        if request.method == 'POST':
            username = request.POST.get('username', '')
            password = request.POST.get('password', '')
            # 使用authenticate()函数认证给出的用户名和密码。它接受两个参数,用户名username和密码password
            # 并在用户名密码正确的情况下返回一个user对象。如果用户名密码不正确,则authenticate()返回None
            user = auth.authenticate(username=username, password=password)
            if user is not None:
                auth.login(request, user)  # 登录
                request.session['user'] = username  # 将session信息记录到浏览器
                response = HttpResponseRedirect('/event_manage/')
                return response
            else:
                return render(request, 'index.html', {'error': 'username or password error!'})
    

    关上窗户

    1、http://127.0.0.1:8000/event_manage/ 可以直接打开登录成功页,我们需要把这个窗户关上,只需要如下修改:

    from django.contrib import auth
    .....
    
    # 发布会管理
    @login_required
    def event_manage(request):
        username = request.session.get('user', '')
        return render(request, "event_manage.html", {"user": username})
    

    再次尝试访问/event_manage/目录(千万不要忘记清理浏览器缓存再试!),Django会告诉访问的路径并不存在(404)。

    2、修改.../urls.py文件,添加以下路径

      url(r'^accounts/login/$', views.index),

    现在访问以下url都能跳转到登录页面了

    http://127.0.0.1:8000/
    http://127.0.0.1:8000/index/
    http://127.0.0.1:8000/event_manage/

  • 相关阅读:
    控制翻转与容器
    构造函数传递参数
    bean属性检查
    tomcat源码阅读14
    Block Formatting Context
    IE 兼容性问题的处理
    JavaScript 的原型与继承
    IE 多版本测试工具 IETester
    callee,caller,call,apply
    HDOJ2175 汉诺塔IX
  • 原文地址:https://www.cnblogs.com/lingzeng86/p/7078654.html
Copyright © 2011-2022 走看看