[学习笔记]Python web开发利器-Django再遇

Django本身是遵循了MVC架构的一个Web开发框架,这个我们可以稍后再详细了解。
还是从实际例子来继续学习吧。


改用模板的来做视图

  • 在上次我们所创建的项目中的sign目录下创立一个templates目录
  • 新建一个index.html在此目录下,index.html的内容可如下:
1.jpg
2.jpg

更新视图为登录界面

  • 修改index.html的内容为:
4.jpg
5.jpg

到了这一步,我们其实只是实现了界面展示的初步功能,要想真正实现登录还需要思考以一些问题:

  • 当用户输入用户名密码并点击“登录”按钮之后,表单(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!”
  1. 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>
……

修改完后尝试一下登录成功和失败的页面。

2.jpg
1.jpg

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

TO be continue

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 经过对django的初步学习,我们已经对后台的基本流程以及django的运作有了一定的了解,但是这还不足够,dja...
    coder_ben阅读 9,238评论 8 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,486评论 19 139
  • 此段内容简要来自自强学堂的教程详情请查询自强学堂 一、 后台的运作流程 接收request请求 处理数据 获取请求...
    coder_ben阅读 10,613评论 6 56
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,296评论 22 257
  • 本文是Medusa和Hydra快速入门手册的第二部分,第一部分的传送门这两篇也是后续爆破篇的一部分,至于字典,放在...
    LinuxSelf阅读 8,024评论 0 4