Django本身是遵循了MVC架构的一个Web开发框架,这个我们可以稍后再详细了解。
还是从实际例子来继续学习吧。
改用模板的来做视图
- 在上次我们所创建的项目中的sign目录下创立一个templates目录
- 新建一个index.html在此目录下,index.html的内容可如下:

- 再次刷新URL:http://localhost:8000/index/

更新视图为登录界面
- 修改index.html的内容为:

- 再次刷新URL:http://localhost:8000/index/

到了这一步,我们其实只是实现了界面展示的初步功能,要想真正实现登录还需要思考以一些问题:
- 当用户输入用户名密码并点击“登录”按钮之后,表单(form)中的数据要以什么方式(GET/POST)提交系统?
- 系统如何验证得到的用户名密码?
- 如果验证成功应该跳转到什么页面?
- 如果验证失败如何将错误提示
返加给用户?
构建GET/POST请求
当客户机通过HTTP 协议向服务器提交请求时,最常用到的方法是GET 和POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
修改GET请求在index.html中
···
...
<form method = "get">
<input name="username" type="text" placeholder="username" >
<input name="password" type="password" placeholder="password">
<button id="btn" type="submit">登录</button>
</form>
...
···
刷新URL后并输入用户名和密码后可以看到URL上的值变为:http://localhost:8000/index/?username=admin&password=admin123
(注:GET 方法会将用户提交的数据添加到URL 地址中,路径后面跟问号“?”,username 和password 为HTML 代码中<input>标签的name 属性值,username=admin 表示用户名输入框得到的输入数据为“admin”。password=admin123 密码输入框得到的输入数据为“admin123”。多个参数之间用“&”符号隔开。)修改POST请求在index.html中
···
...
<form method = "POST">
<input name="username" type="text" placeholder="username" >
<input name="password" type="password" placeholder="password">
<button id="btn" type="submit">登录</button>
</form>
{% csrf_token %}
...
···
做了两处修改,一是将GET修改为POST,另外是添加了一个csrf_token,这个是Django针对csrf攻击做的安全性补救,在每一个form请求的时候都需要带上一个token,以此来判定所有的请求都来自同一个网站。
处理登录后操作
试想一下如果我们在登录的时候会遇到的两种情况:
- 如果验证成功,即是用户名和密码输入正确时(先默认设置用户名为admin,密码为123456),显示“login sucess!”
- 如果验证失败,即是用户名和密码输入错误时(先默认设置用户名为admin,密码为123456),显示“username or password error!”
- POST请求后的数据应将在action中处理
通过form 表单的action 属性来指定提交的路径
index.html
<form method="post" action="/login_action/">
march/urls.py中添加login_action的路由
urlpatterns = [
……
url(r'^login_action/$', views.login_action),
]
修改sign/views.py 文件,创建login_action 视图函数
# 登录动作
def login_action(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
if username == 'admin' and password == '123456':
return HttpResponse('login success!')
else:
return render(request,'index.html', {'error': 'username or password
error!'})
但是,在index.html 页面上并没有显示错误提示的地方,所以,需要在index.html 页面中添加Django模板语言{{error}},它对应render 反回字典中的key,并且在登录失败的页面中显示value,即“username or password error!”信息.
……
<form method="post" action="/login_action/">
<input name="username" type="text" placeholder="username" ><br>
<input name="password" type="password" placeholder="password"><br>
{{ error }}<br>
<button id="btn" type="submit">登录</button>
{% csrf_token %}
</form>
……
修改完后尝试一下登录成功和失败的页面。


Login Success只是一种替代方案,让我们来试试更多的功能,比如登录成功后是活动的列表。
TO be continue
