Django视图

Posted 落花无意溪自流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/

以上是关于Django视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django Summernote 中显示编程片段的代码块?

回收站视图未显示在片段中

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

如何从片段内的列表视图打开链接网址?

django-缓存的三种应用