0.本周知识点总结

  • Ajax验证
  • django form 验证
  • CSRF安全
  • Cookie
  • Session
  • model 数据库ORM

1.Ajax验证

应用场景:验证用户输入是否合法

前端Ajax代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title><style>.error-tag {color: red;}</style>
</head>
<body><div><div><input type="text" name="user" />
{#            <span class="error-tag">aaa</span>#}</div><div><input type="password" name="pwd" /></div><input type="button" value="提交" onclick="DoSubmit();" /></div><script src="/static/jquery-1.12.4.js"></script><script>function DoSubmit(){
{#            定义一个要传入后端的字典#}var input_dict = {};
{#            对所有的input进行循环#}$('input').each(function(){
{#                拿到每个input标签用户输入的值#}var v = $(this).val();
{#                拿到每个input标签的属性值#}var n = $(this).attr('name');
{#                拼接到字典,例如:{"username":"lk"}#}input_dict[n] = v;});
{#            先把所有的span标签都删除#}$("span").remove();
{#            Ajax验证开始#}$.ajax({
{#                url:/login/ POST请求 向后端传入字典 类型json#}url: '/login/',type: 'POST',data: input_dict,dataType : "json",
{#                拿到后端返回的值,result就是拿到的值,判断是否登陆成功,根据判断进行处理#}success: function (result) {if (result.status) {location.href = "https://www.jd.com";} else {
{#                        假如验证失败,result是返回的信息,result.message是总的报错信息,其中有pwd\user的,每一项有相应的message的信息#}$.each(result.message, function(k,v){
{#                            创建span标签#}var tag = document.createElement("span");tag.className = "error-tag";
{#                            span标签内容就是报错信息,v[0]就是报错信息#}tag.innerText = v[0].message;
{#                            利用拼接,根据属性,在input标签下方添加span标签.#}$('input[name="' + k + '"]').after(tag);})}},error: function () {}})}</script>
</body>
</html>

2.Django Form 验证

应用场景:同样是用于用户认证,还<!DOCTYPE html>

<html lang="en">
<head><meta charset="UTF-8"><title></title><style>.error-msg{color: red;}</style>
</head>
<body><form action="/login/" method="POST"><div><div>          obj1是字典,是后端传过来的form类生成的,然后obj1.user 是一个标签          {{ obj1.user }}                  假如有报错,则生成错误标签{% if  obj1.errors.user %}<span class="error-msg">{{ obj1.errors.user.0 }}</span>{% endif %}</div><div>{{ obj1.pwd }}<span class="error-msg">{{ obj1.errors.pwd.0 }}</span></div><div>{{ obj1.num }}<span class="error-msg">{{ obj1.errors.num.0 }}</span></div><div>{{ obj1.phone }}<span class="error-msg">{{ obj1.errors.phone.0 }}</span></div><div>{{ obj1.test }}<span class="error-msg">{{ obj1.errors.test.0 }}</span></div><input type="submit" value="提交" /></div></form>
</body>
</html>

后端代码:

import re
# 定义手机号格式
def mobile_validate(value):mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')if not mobile_re.match(value):raise ValidationError('手机号码格式错误')# 定义一个form验证类,必须继承forms.Form
# required输入非空限制,error_messages错误提示内容,min_length最小输入长度,max_length最大输入长度,validators可以加函数控制
# forms.类型
# 每个字段名比如user,就是前端input标签的name值.类型默认是text
class LoginForm(forms.Form):user = forms.CharField(required=True, error_messages={'required': '用户名不能为空.'}, max_length=6)pwd = forms.CharField(required=True,min_length=6,max_length=10,error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})num = forms.IntegerField(error_messages={'required': '数字不能空.','invalid': '必须输入数字'})phone = forms.CharField(validators=[mobile_validate, ],)#test = forms.CharField(widget=forms.Textarea(attrs={'class': 'c1'}))test_choices = ((0, '上海'),(1, '背景'),)# select标签里要写上里边的option,要以元组的形式带入test = forms.IntegerField(widget=forms.Select(choices=test_choices))
def login(request):if request.POST:objPost = LoginForm(request.POST)# is_valid 判断输入是否合法ret = objPost.is_valid()print("ret:", ret)if ret:print("clean:", objPost.clean())print(objPost.clean())print("user", objPost["user"])else:from django.forms.utils import ErrorDict# 报错信息print(type(objPost.errors),objPost.errors.as_json())# obj1.errorspassprint("objPost:", objPost)print("objPost,Type:", type(objPost))print("objPost.user:", objPost["user"])return render(request, 'login.html',{'obj1': objPost})

python的输出:

ret: False
<class 'django.forms.utils.ErrorDict'> {"user": [{"code": "max_length", "message": "Ensure this value has at most 6 characters (it has 8)."}]}
objPost: <tr><th><label for="id_user">User:</label></th><td><ul class="errorlist"><li>Ensure this value has at most 6 characters (it has 8).</li></ul><input id="id_user" maxlength="6" name="user" type="text" value="11111111" required /></td></tr>
<tr><th><label for="id_pwd">Pwd:</label></th><td><input id="id_pwd" maxlength="10" minlength="6" name="pwd" type="text" value="dddddddddd" required /></td></tr>
<tr><th><label for="id_num">Num:</label></th><td><input id="id_num" name="num" type="number" value="42222222" required /></td></tr>
<tr><th><label for="id_phone">Phone:</label></th><td><input id="id_phone" name="phone" type="text" value="13111112222" required /></td></tr>
<tr><th><label for="id_test">Test:</label></th><td><select id="id_test" name="test" required>
<option value="0" selected="selected">上海</option>
<option value="1">背景</option>
</select></td></tr>
objPost,Type: <class 'day19_app.views.LoginForm'>
objPost.user: <input id="id_user" maxlength="6" name="user" type="text" value="11111111" required />

3.CSRF

当在settings.py中未注释这一行时,就会产生CSRF 安全中间件的审核。

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

如图:

这种情况可以分为三种解决方案:

1.注释掉那行配置,这个不多说

2.form表单验证,在前端代码加入:

<body><form action="/csrf/" method="post">{% csrf_token %}   加入这一行!!!!!!<input type="text" name="t1"/><input type="submit" value="form提交"/></form>

这时,在浏览器看前端代码就可以看到

这就相当于一层安全认证,当访问时,django会写入浏览器一些数据,如下次带着这个数据访问,就可通过,如没有数据,则会被拦截,这个一般是防止XSS攻击的。

3.Ajax验证。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/csrf/" method="post">{% csrf_token %}<input type="text" name="t1"/><input type="submit" value="form提交"/></form><input type="button" value="ajax提交" onclick="DoAjax();"/><script src="/static/jquery-1.12.4.js"></script><script src="/static/jquery.cookie.js"></script><script>var csrftoken = $.cookie('csrftoken');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}$.ajaxSetup({beforeSend: function(xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}});
{#        主函数#}function DoAjax(){$.ajax({url: "/csrf/",type: "POST",data : {"k1":"v1"},success: function (data) {console.log(data);}})}</script>
</body>
</html>

4.cookie

cookie是服务端写入浏览器的,这个要确保浏览器允许写入cookie。

1.设置cookie

后端代码:

def cookie(request):#打印请求cookieprint(request.COOKIES)#返回前端页面obj = render(request, 'cookie.html')#在浏览器设置cookie:  "k3":"v3",path是只有在访问/cookie时能看到obj.set_cookie('k3','v3',path='/cookie/')return obj

5.session

cookie是保存在客户端浏览器,session是保存在服务端

USER_LIST = ["lk", "liukai"]def session_login(request):if request.method == "POST":# 获取用户名和密码u = request.POST.get("user")p = request.POST.get("pwd")if p == "123" and u in USER_LIST:# 在服务端设置session: "user" = "输入的用户名"request.session['user'] = ureturn redirect('/session_index/')return render(request, "session_login.html")# 登陆验证,验证服务端是否配置了session
def auth(func):def inner(request, *args, **kwargs):user = request.session.get('user', None)print(user)if not user:return redirect('/session_login')return func(request, *args, **kwargs)return inner# 直接访问index页面,先验证session
@auth
def session_index(request):user = request.session.get('user')return render(request, "session_index.html", {"user": user})def session_logout(request):del request.session["user"]return redirect("/session_login/")

前端代码 session_index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title></title>
</head>
<body><h1>欢迎:{{ user }}登录</h1><a href="/session_logout/">注销</a>
</body>
</html>

转载于:https://www.cnblogs.com/Caesary/p/5881598.html

python周报第十九周相关推荐

  1. python周报第十五周

    0.本周知识点预览 CSS基础补充 JavaScript基础 1.CSS基础补充 1.input(html)默认选项 <!DOCTYPE html> <html lang=" ...

  2. 第十九周学习周报(20180709-20180715)

    第十九周学习周报 一.本周学习情况 1.学习了李宏毅老师的深度学习课程 2.跑了识别猪的模型 二.学习笔记      在生成lmdb过程中,出现路径错误,将文件的路径换成绝对路径再尝试. cv2.Ve ...

  3. 研究生周报(第十九周)

    研究生周报(第十九周) 学习目标 Transformer LAS CTC RNN-T Language-Model 学习时间 9.11 ~ 9.17 学习产出 Transformer Embeddin ...

  4. 极乐技术周报(第十九期)

    2019独角兽企业重金招聘Python工程师标准>>> 极乐技术周报(第十九期) 为什么程序员总是搞混万圣节和圣诞节? 因为... Oct 31 = Dec 25. 1.爬虫工程师如 ...

  5. 三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣

    [dogkeji-科技犬] 各位网友周末好,又到了2020年第十九周的PC.笔电.数码周边新品发布汇总时刻(2020年5月4日至2020年5月9日),那么本周有那些PC.笔电.数码周边新品发布呢?通过 ...

  6. 左耳听风 第四十九周

    左耳听风 第四十九周 每周完成一个ARTS: 每周至少做一个 leetcode 的算法题.阅读并点评至少一篇英文技术文章.学习至少一个技术技巧.分享一篇有观点和思考的技术文章.(也就是 Algorit ...

  7. 关键词数量统计python_利用python统计《十九大报告》中的关键词和词频

    利用python统计<十九大报告>中的关键词.报告摘要和词频.引用snowNLP.得到的结果: 1.关键词: 前五个关键词为 ['发展', '人民', '中国', '党', '建设'] 2 ...

  8. 左耳听风 第二十九周

    左耳听风 第二十九周 每周完成一个ARTS: 每周至少做一个 leetcode 的算法题.阅读并点评至少一篇英文技术文章.学习至少一个技术技巧.分享一篇有观点和思考的技术文章.(也就是 Algorit ...

  9. Swift 周报 第二十九期

    文章目录 前言 新闻和社区 担心泄密!外媒:苹果公司限制员工使用ChatGPT 苹果公司大幅削减其MR头显销售预期,不足百万台 提案 通过的提案 正在审查的提案 Swift 论坛 1.讨论 Swift ...

  10. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

最新文章

  1. 基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
  2. 史上最全Android开发中100%会用到的开源框架整理(1/5)
  3. 从配置文件的角度去了解Yii2
  4. Hadoop yarn容量调度器capacity-scheduler.xml配置示例
  5. JVM调优:指定垃圾回收器组合
  6. 初识python你应该知道的6个知识点!
  7. python 基础(一)
  8. Mysql对用户操作加审计功能——高级版
  9. 重学JavaScript系列之一_引用类型
  10. Codeforces Global Round 14, C. Phoenix and Towers
  11. golang panic: assignment to entry in nil map(map赋值前要先初始化 - map的初始化及使用 )
  12. slick edit
  13. 全网整合营销能力训练要点
  14. 《数据库系统概论》知识整理
  15. QIIME 2:可重复、交互和扩展的微生物组数据分析流程
  16. 补天漏洞平台:让更多的白帽子脱离黑产
  17. 爬虫教程( 3 ) --- 手机 APP 数据抓取
  18. 这些例子感觉很实用,希望对你也有帮助
  19. Python中四舍五入的讲解
  20. 【设计模式】我对设计模式的C语言解读(下)

热门文章

  1. Ubuntu与Docker -- Docker安装、使用、容器环境搭建
  2. Redis进阶不得不了解的内存优化细节
  3. training test validation 各有其用,实践中有了体会
  4. CodeForces-28C-Bath Queue-概率DP[ ICPC2016大连热身D]
  5. jQuery DataTables: How to add a checkbox column
  6. spring mvc 上传文件
  7. org manual翻译--2.7 纯文本列表
  8. 翻译 Real-Time Global Localization of Robotic Cars in Lane Level via Lane Marking Detection and Shape
  9. TCP实现原理(报文段结构+可靠数据传输+流量控制)
  10. 软件工程第二次作业中第一个作业