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/

posted @ 2017-06-26 00:48  落花无意溪自流  阅读(263)  评论(0编辑  收藏  举报