之前就着手开始尝试用django来简化web开发的流程周期,果不其然,速度还行,当然前期的产品那就相当粗糙了。举例来说,就连最基本的登录都是抄别人的,最可怕的是用GET方法提交表单,今天就尝试解决这个问题,用POST方法来提交登录数据。

做过web开发的都知道相对而言,POST方法比GET方法更安全,真的是这样么?

下面先具体说明如何用GET方法提交表单:

template模板代码:

  1. <form id="login" class="form-horizontal" role="form" action="/login" method="get" onSubmit="return validate_form(this)">
  2. <div class="form-group" >
  3. <div class="login-l"><label for="username" class="col-sm-2 control-label">用户名</label></div>
  4. <div class="col-sm-2 login-r" >
  5. <input type="text" class="form-control" id="username" name="username" placeholder="Username">
  6. </div>
  7. </div>
  8. <div class="form-group">
  9. <div class="login-l"><label for="inputPassword3" class="col-sm-2 control-label">密码</label></div>
  10. <div class="col-sm-2 login-r">
  11. <input type="password" class="form-control" id="password" name="password" placeholder="Password">
  12. </div>
  13. </div>
  14. <div class="form-group" >
  15. <div class="col-sm-offset-2 col-sm-10" >
  16. <div class="checkbox">
  17. <label>
  18. <input type="checkbox"> 记住我
  19. </label>
  20. </div>
  21. </div>
  22. </div>
  23. <div class="form-group">
  24. <div class="col-sm-offset-2 col-sm-10" >
  25. <button type="submit" class="btn btn-default" >登录</button>
  26. {% if error %}
  27. <font color="red">{{ error }}</font>
  28. {% endif %}
  29. </div>
  30. </div>
  31. </form>

views.py逻辑处理代码:

  1. from django.shortcuts import render_to_response
  2. from django.contrib import auth
  3.  
  4. def index(request):
  5. # current_date=datetime.datetime.now()
  6. if request.user.is_authenticated():
  7. 'if the session remains , auto login'
  8. return render_to_response('srvMonitor/srvstatus.html')
  9. else:
  10. return render_to_response('login.html')
  11.  
  12. def login(request):
  13. username = request.GET.get('username')
  14. password = request.GET.get('password')
  15. User = auth.authenticate(username=username, password=password)
  16.  
  17. if User is not None and User.is_active:
  18. auth.login(request, User)
  19. return render_to_response('srvMonitor/srvstatus.html')
  20. else:
  21. return render_to_response('login.html', {'error': "用户名密码错误"})

get方法来提交表单在settings.py中基本没啥很多需要配置的。

下面再说下如何用POST方法来提交表单,如果在上面代码的基础上直接把模板中的提交方法从GET改为POST,必定会报下面的错误:

  1. Forbidden () CSRF verification failed. Request aborted.Help Reason given for failure: CSRF token missing or incorrect.
  2.  
  3. In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly.
  4. For POST forms, you need to ensure: Your browser is accepting cookies. The view function uses RequestContext for the template,
  5. instead of Context. In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
  6. If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag,
  7. as well as those that accept the POST data. You're seeing the help section of this page because you have DEBUG = True in your Django settings file.
  8. Change that to False, and only the initial error message will be displayed. You can customize this page using the CSRF_FAILURE_VIEW setting.

从报错中可以看出需要配置三个地方:

1. settings.py需要设置:APPEND_SLASH = False

2. 提交表单的form中需要添加 {% csrf_token %}

3. 处理提交表达逻辑中需要添加修饰符 @csrf_protect, 跳转需要添加 context_instance=RequestContext(request)

也就是下面的几项:

template模板代码:

  1. <form id="login" class="form-horizontal" role="form" action="/login" method="post" onSubmit="return validate_form(this)">
  2. {% csrf_token %}
  3. <div class="form-group" >
  4. <div class="login-l"><label for="username" class="col-sm-2 control-label">用户名</label></div>
  5. <div class="col-sm-2 login-r" >
  6. <input type="text" class="form-control" id="username" name="username" placeholder="Username">
  7. </div>
  8. </div>
  9. <div class="form-group">
  10. <div class="login-l"><label for="inputPassword3" class="col-sm-2 control-label">密码</label></div>
  11. <div class="col-sm-2 login-r">
  12. <input type="password" class="form-control" id="password" name="password" placeholder="Password">
  13. </div>
  14. </div>
  15. <div class="form-group" >
  16. <div class="col-sm-offset-2 col-sm-10" >
  17. <div class="checkbox">
  18. <label>
  19. <input type="checkbox"> 记住我
  20. </label>
  21. </div>
  22. </div>
  23. </div>
  24. <div class="form-group">
  25. <div class="col-sm-offset-2 col-sm-10" >
  26. <button type="submit" class="btn btn-default" >登录</button>
  27. {% if error %}
  28. <font color="red">{{ error }}</font>
  29. {% endif %}
  30. </div>
  31. </div>
  32. </form>

views.py逻辑代码:

  1. from django.contrib import auth
  2. from django.views.decorators.csrf import csrf_protect
  3.  
  4. def index(request):
  5. # current_date=datetime.datetime.now()
  6. if request.user.is_authenticated():
  7. 'if the session remains , auto login'
  8. return render_to_response('srvMonitor/srvstatus.html')
  9. else:
  10. return render_to_response('login.html',
  11. context_instance=RequestContext(request))
  12.  
  13. @csrf_protect
  14. def login(request):
  15. username = request.POST.get('username')
  16. password = request.POST.get('password')
  17. User = auth.authenticate(username=username, password=password)
  18.  
  19. if User is not None and User.is_active:
  20. auth.login(request, User)
  21. return render_to_response('srvMonitor/srvstatus.html')
  22. else:
  23. return render_to_response('login.html', {'error': "用户名密码错误"},
  24. context_instance=RequestContext(request))

settings.py配置代码:

  1. MIDDLEWARE_CLASSES = (
  2. 'django.middleware.common.CommonMiddleware',
  3. 'django.middleware.csrf.CsrfViewMiddleware',
  4. 'django.contrib.sessions.middleware.SessionMiddleware',
  5. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  6. 'django.contrib.messages.middleware.MessageMiddleware',
  7. )
  8. APPEND_SLASH = False

这个还是比较简单的,主要是找网上的那些资料真心不容易,某墙前几天连honxi都没法翻过去了,真实坑死了我们这群苦逼民工。

django form POST方法提交表达的更多相关文章

  1. Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)

    1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...

  2. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  3. js实现无刷新表单提交文件,将ajax请求转换为form请求方法

    最近在做项目的时候遇到一个需要上传文件的需求,因为ajax请求是无法上传二进制文件流的,所以只能用form表单提交,而form提交有一个问题就是会使页面刷新,本文解决了form表单提交文件时页面刷新的 ...

  4. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

    MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交

  5. form表单提交的方法

    最近研究了下html中,form保单提交的几种方法,现与大家分享一下(注:网上可能已经有好多版本了,这里自己写下来做个总结了,哈!): 方法一:利用form的onsubmit()函数(经常使用) &l ...

  6. python中前后端通信方法Ajax和ORM映射(form表单提交)

    后端从数据库获取数据给到前端: 第一种方式: admin.py文件代码: @admin.route('/showList') def show(): # 获取数据库所有文章数据,得到一个个对象 res ...

  7. 关于form表单提交到Servlet的时候出现tomcat启动错误的解决方法

    1.遇到的问题 今天在写jsp代码的时候通过form表单提交到Servlet的时候出现的tomcat启动错误,琢磨了半天,终于找到了解决方法. 解决问题的关键就在于xml配置的路径和servlet中默 ...

  8. js的form表单提交url传参数(包含+等特殊字符)的解决方法

    方法一:(伪装form表单提交) linkredwin = function(A,B,C,D,E,F,G){        var formredwin = document.createElemen ...

  9. django 使用form组件提交数据之form表单提交

    django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...

随机推荐

  1. android精确绘制文字位置的方法

    android 中使用Canvas的drawText绘制文本的位置,是基于基线的. 例如以下图: 当中字母Q的小尾巴在横线以下了. 怎么样找准字母的中心位置呢? 先看以下的样例:(右边的数字,表示字体 ...

  2. ES6 iterator 迭代器

    iterator使用TypeScript 的描述: interface Iterable { [Symbol.iterator]() : Iterator, } interface Iterator ...

  3. 1、jQuery概述

    JQuery基本功能  ① 访问和操作Dom元素  ② 控制页面样式  ③ 对页面事件的处理  ④ 大量插件在页面中的运用  ⑤ 与Ajax技术的完美结合      $(document).ready ...

  4. 在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数

    摘要:本文主要讲述怎样在进程中执行新代码,以及exec系列函数的基本用法. 在进程中执行新代码 用函数fork创建子进程后,假设希望在当前子进程中运行新的程序,能够调用exec函数运行还有一个程序.当 ...

  5. 【HTML】百度地图webAPI使用

    1.登录百度地图,创建WEB应用,设置白名单.获取该WEB应用的ak 2.在页面引入相应的js和ak 3.效果(CSS不提供): 4.实例化地图map,并给map添加相应的搜索和确定坐标事件 < ...

  6. Servlet容器 Jetty

    http://www.oschina.net/p/jettyJetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境.Jetty是使用Java语 ...

  7. bootstrap 学习笔记 轮播(Carousel)插件

    Bootstrap轮播(carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除些之外,内容也是足够灵活的,可以是图像,内嵌框架,视频或者其他您想要旋转的任何类型的内容. 示例: 下面是不念 ...

  8. 用Fiddler 发送post请求

    在调试web api的时候,若是get 请求,可以直接在浏览器里查看结果,如果是put,或者post请求在浏览器地址栏里就没有办法了. 下面介绍一下,如何利用fiddler模拟post请求. 也可以用 ...

  9. 自制MVC框架CRUD操作、列表、分页显示插件介绍

    这里涉及到的操作都是引用自Stephen.DALService数据层.数据访问层实现方式在后文中我会仔细的说明,先说明一下数据操作集成的插件. 1).InsertAttribute 用于插入记录. 状 ...

  10. spring中aop以xml配置方式

    1 引jar包 springAOP\aopalliance.jar springAOP\aspectjrt.jar springAOP\aspectjweaver.jar springAOP\spri ...