1. Cookie是什么 保存在浏览器端的键值对 为什么要有Cookie? 因为HTTP请求是无状态的 Cookie的原理? 服务端可以在返回响应的时候 做手脚 在浏览器上写入键值对(Cookie) 浏览器发送请求的时候会自动携带该网站保存在我浏览器的键值对(Cookie) Django 从请求携带的Cookie中取值: request.COOKIES.get("is_login") request.get_signed_cookie(key, default=None, salt="xxx") Django中设置Cookie:(针对的是响应对象) rep = HttpResponse()/render(request, "test.html)/redirect() rep.set_signed_cookie(key, value, salt="xxx", max_age=7) Django中删除Cookie:(注销) rep.delete_cookie(key) 2. Session是什么 Session保存在服务端的键值对 Session依赖于Cookie dsadasdsadsafsjkndf: {"is_login": 1, "name": "xiaohei", "age":18} dsaasdaknfgreryywdf: {"is_login": 1, "name": "xiaobai", "age":20} wqrqrteknfgzddasqfg: {"is_login": 0, "name": "xiaohui", "age":48} 给浏览器写入Cookie: sessionid:wqrqrteknfgzddasqfg 1. 从用户发来的请求的Cookie中 根据 sessionid 取值, 取到 wqrqrteknfgzddasqfg 2. 根据特殊字符串找到对应的 Session 数据 --> {"is_login": 0, "name": "xiaohui", "age":48} 3. request.session.get("is_login") --> 从Session取值 Django中设置Session: request.session["is_login"] = 1 request.session.set_expiry(7) # 设置超时时间 (Cookie和Session数据的) 在settings.py中设置,每次请求都刷新Session超时时间 SESSION_SAVE_EVERY_REQUEST = True Django中删除Session: request.session.flush() 清除Cookie和Session数据 request.session.clear_expired() 将所有Session失效日期小于当前日期的数据删除 今日内容 AJAX 1. 预备知识 JSON 2. 我们之前已经学过的发请求的方式: 1. 直接在地址栏输入URL回车 GET请求 2. a标签 GET请求 3. form表单 GET/POST请求 4. AJAX GET/POST请求 3. AJAX 特点: 1. 异步 2. 局部刷新浏览器(偷偷发请求)
1. 回顾了一下json数据格式 1. JS对象 和 json数据格式的互相转换 2. Python中数据 和 json数据格式的互相转换 2. AJAX 1. 我们前端往后端发请求的方式: 1. 直接在地址栏输入URL 2. a标签 3. form表单 4. AJAX HTTP请求的类型: GET POST 2. AJAX特点: 1. 异步 2. 局部刷新(偷偷发请求) 3. AJAX缺点: 请求零碎,滥用对服务端压力大 4. jQuery封装的AJAX方法: 先导入 jquery.js $.ajax({ url: "/test/", type: "post", data: {"key": "value", "key2":[[1, 2, 3], [4, 5, 6]]}, success: function(arg){ // 请求得到响应的时候,自动执行这个回调函数 console.log(arg); } }) 今日内容 1. form组件的介绍 之前web开发的模式,以注册为例: 1. 要有一个注册的页面,页面里面要有form表单 --> 生成HTML代码 2. form表单要能提交数据到后端,后端要做有效性校验 --> 数据有效性校验 3. 要把校验的提示信息展示在页面上 --> 校验信息返回并展示,保存原来填写的内容 关于校验: 1. 前端通过JS代码做校验 --> 最好有 2. 后端做校验 --> 必须要有(因为前端的校验可以被跳过) 2. form组件的用法 1. from django import forms 2, 定义一个form类 class RegForm(forms.Form): user = forms.CharField() pwd = forms.CharField() email = forms.EmailField() 生成HTML: 3. 实例化一个form对象, 传递到模板语言中 4. 在目标语言中调用form对象的响应方法和属性 三种方式: 1. {{ form_obj.as_p }} 2. 单独写 {{ form_obj.pwd.label }} {{ form_obj.pwd }} 做校验: 1. form_obj = RegForm(request.POST) 2. form_obj.is_valid() 内置的正则校验器的使用 mobile = forms.CharField( label="手机", # 自己定制校验规则 validators=[ RegexValidator(r'^[0-9]+$', '手机号必须是数字'), RegexValidator(r'^1[3-9][0-9]{9}$', '手机格式有误') ], widget=widgets.TextInput(attrs={"class": "form-control"}), error_messages={ "required": "该字段不能为空", } ) 看源码: form_obj.is_valid()都干了什么? self._errors = ErrorDict() --> {} self.cleaned_data = {} self.fields.items() 字段名 字段对象 如果有错误: self._errors["name"] = "" 没有报错: self.cleaned_data["name"] = value(用户填写的值) 注意: 钩子函数(hook)的使用 def clean_xx(): """具体字段的自定义校验方法""" pass def clean(): """全局的自定义校验方法""" pass errors: <ul class="errorlist"> <li>name <ul class="errorlist"> <li>不符合社会主义核心价值观!</li> </ul> </li> <li>__all__ <ul class="errorlist nonfield"> <li>两次密码不一致</li> </ul> </li> </ul>
今日内容 中间件:http://www.cnblogs.com/liwenzhou/p/8761803.html 1. URL的白名单 url = ["/xx/", "/oo/", "/haha/"] 2. 登陆之后才能访问某些URL 之前使用装饰器 中间件的定义: wsgi之后 urls.py之前 在全局 操作Django请求和响应的模块! 中间件的使用: 5个固定的方法 process_request(self, request) 执行顺序: 按照注册的顺序(在settings.py里面设置中 从上到下的顺序) 何时执行: 请求从wsgi拿到之后 返回值: 返回None,继续执行后续的中间件的process_request方法 返回response , 不执行后续的中间件的process_request方法 process_response 执行顺序: 按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序) 何时执行: 请求有响应的时候 返回值: 必须返回一个response对象 process_view(self, request, view_func, view_args, view_kwargs): 执行顺序: 按照注册的顺序(在settings.py里面设置中 从上到下的顺序) 何时执行: 在urls.py中找到对应关系之后 在执行真正的视图函数之前 返回值: 返回None,继续执行后续的中间件的process_view方法 返回response, process_exception(self, request, exception) 执行顺序: 按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序) 何时执行: 视图函数中抛出异常的时候才执行 返回值: 返回None,继续执行后续中间件的process_exception 返回response, process_template_response(self, request, response) 执行顺序: 按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序) 何时执行: 视图函数执行完,在执行视图函数返回的响应对象的render方法之前 返回值: 返回None,继续执行后续中间件的process_exception 返回response, Django调用 注册的中间件里面五个方法的顺序: 1. process_request urls.py 2. process_view view 3. 有异常就执行 process_exception 4. 如果视图函数返回的响应对象有render方法,就执行process_template_response 5. process_response Django已经学过的知识点: 1. Urls.py 路由系统: 正则 分组匹配 --> 位置参数 分组命名匹配 --> 关键字参数 分级路由 include 给路由起别名 name="xx" 反向解析url view from django.urls import reverse reverse("xx", args=[1, 2, 3]) reverse("xx", kwargs={”k": "v"}) 自取其辱 2. 视图 views.py request request.method request.GET --> URL里面的参数 request.POST --> post请求的数据 request.path_info --> 路径 request.get_full_path() --> 路径加路径的参数 response 新手必备3件套 render(request, "xx.html", {“k”: "v", ...}) HttpResponse("响应") redirect("/index/") redirect("http://www.luffycity.com") from django.http import JsonResponse JsonResponse() FBV和CBV 函数装饰器和方法装饰器的区别 3. 模板 filter 内置的filter方法 自定义的filter方法 tag 内置的tag 自定义的simpleTag 自定义的inclusionTag 母版和继承 {% extends ‘base.html’ %} {% block page-main %} {% block small %} {% endblock small %} {% endblock page-main %} 组件 {% include nav %} 静态文件相关的tag 在模板语言里面反向解析url {% url 'url的别名' xx %} 4. ORM 对应关系 类 --> 数据表 对象 --> 数据行 属性 --> 字段 Django连接MySQL数据库的步骤: 1. 手动创建库 2. 配置settings.py中数据库的连接信息 3. 修改settings.py同目录下的__init__.py文件,添加两句 import pymysql pymysql.install_as_MySQLdb() 4. 在app下面的models.py中定义类,类一定要继承mdoels.Model 5. 执行两句命令 1. python manage.py makemigrations 2. python manage.py migrate 操作数据表 操作数据行(增删改查) 单表 外键 多对多 一对一 ORM高级: 常用字段和方法 必知必会13条 神奇的双下划线 跨表的正向查询反向查询 F和Q 聚合和分组 事务 执行原生的SQL语句 5. Cookie和Session,分页 6. AJAX $.ajax({ url: “”, type: "post", data: {"k1": JSON.stringify([1,2,3])}, success:function(data){ } }) 7. form表单 8. 中间件