Python学习笔记第二十一周
目录:
1、URL
2、Models
- 操作
3、Templates
- html模板的使用
- 自定义函数
4、cookie和session
5、分页(自定义分页)
6、Form验证
内容:
1、URL
默认值:
urls.py
url(r'^index/', views.index, {'name': 'root'}),
views.py
def index(request,name):
print(name)
return HttpResponse('ok')
命名空间:
namespace是添加在name前面,和name结合一起生成URL的方法
#urls.py中
from django.conf.urls import url,include urlpatterns = [
url(r'^a/',include('app01.urls',namespace='author')),
] #app01的urls.py中
from django.conf.urls import url
from app01 import views
app_name = 'app01'
urlpatterns = [
url(r'^index/',views.index, name='index'),
]
#app01的views中
def index(request):
v = reverse('author:index')
print(v)
return HttpResponse('ok')
备注:
模板语言中需要{% url 'author:index' %}
请求周期:
url -> 路由->函数或者类-> 返回字符串或者模板语言
Form表单提交:
提交-> url->函数或者类中的方法处理,处理完毕后返回给用户:
HttpReponse()或者render()或者redirect()无论哪种方法,最后提交给用户的都是已经处理过的页面
用户看到的永远都是已经处理完成的界面,当接受到redirect时自动发起一个新的URL
Ajax:
$.ajax({
url:'/index/',
data:{'k':'v'},
dataType: 'JSON',
type: 'POST',
traditional: true,
success: function(data){
location.reload() #刷新
locatin.href='某个地址' #跳转
}
})
提交 -> url -> 函数或者类中的方法
HttpResponse()
render(request, 'index.html',{'k':'v'})
生成字符串返回给用户
2、Views
请求的其他信息
3、Models
- 操作
3、Templates
- html模板的使用
a) 在模板中定义:
{% block content %} {% endblock %}
b) 在其他html中:
最上面定义:
{% extends ‘模板页名称’%}
{% block content %}
自定义内容
{% endblock %}
备注:
由于css和js每个网页有可能会修改,所以需要修改:
1、在</style>下面写{% block css %}{% endblock%}
2、在</script>下面写{% block js%}{% endblock%}
这样在子版调用可以分别设置
母版html类型:
1、extends: 每个模板的继承,只能继承一个模板
2、include: {% include ‘tag-name’%} #可以定义多个并可重复调用
- 自定义函数(自定义simple tag) 自定义函数也是在模板里使用的方法
simple_tag:
a、在某个app里创建一个templatetags目录,名字不能改
b、在这个目录下创建一个任意py文件
c、在这个文件中导入:
from django import template
from django.utils.safestring import mark_safe register = template.Library()
@register.simple_tag
d、创建函数:
def func(a1,a2,a3...):
return 'abc'
e、settings文件中注册APP
f、html文件中顶部{% load '该py文件' %}
g、html引用{% 函数名 arg1 arg2 arg* %}#使用时必须使用该方式调用
filter:
filter与simpe_tag比较:
1、filter与simple_tag定义类似,所以a-b步骤一样,c步骤中@register.simple_tag需要改成@register.filter
2、在html中调用,filter最多只能调用两个参数,同时方法为{{ ‘参数1’|函数名:'参数二' }}中间连空格都没法添加,或者{{ ‘参数1’|函数名:数字 }}形式
3、filter可以在{%if ‘参数1’|函数名:'参数二' %}{% endif%} filter可以作为if条件来操作
4、cookie和session
1、cookie:
cookie是保存在用户浏览器的一个键值对,用来记录用户登录信息
def login(request):
当用户名密码核对成功后:
res = redirect('/index/')#将跳转到index界面
res.set_cookie('name': username) #设置cookie值
def index(request):
cookie = request.COOKIES.get('name') #获取cookie
if not cookie:
return redict(‘/login/’)#如何cookie没有获取到就要跳转会login界面
return render(request,'index.html',{'current_name': cookie}) #这样可以显示谁登录了
cookie能提供的功能:
从请求中获取cookie:cookie是已字典的形式存在
1、request.COOKIE[‘username’]
2、request.COOKE.get(‘username’)
生成cookie:
1、设置cookie,关闭浏览器就失效
response.set_cookie(‘key’,'value')
return response
2、cookie参数:
key, 键
value=‘’, 值
max_age=None, 超时时间
expires=None 超时时间(IE requires expires, so set it if hasnt;t been already)
path='/', cookie生效的路径,/表示根路径,特殊的:根路径cookie可以被任何url页面访问,如果写成别的路径,比如/index表示只能在index的url中使用
domain=None, cookie生效域名
secure=False https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
由于cookie保存再客户端的电脑上,所以JavaScript和jquery也可以操作cookie
<script src='/static/js/jquery.cooki.js'></script>
$.cookie('list_pager_num',30,{path: '/'});
例子:
1、response.set_cookie(‘key’,'value',max_age=10)#设置cookie在10s后失效
2、import datetime
current_date = datetime.datetime.utcnow()
current_date += datetime.timedelta(seconds=10)
response.set_cookie(‘key’,'value',expires=current_date)
3、response.set_cookie(‘user_type’,'abcabd',httponly=True)#设置后没法通过js抓取到该cookie
4、juery-cookie:
下载jquery-cookie.js文件:由于它是jquery的插件,用的时候必须放在jquery下面
网址:plugins.jquery.com/cookie
$.cookie('k1','v1') 设置值
$.cookie('k1') 获取值
$.cookie('k','v',{'path':})
通过cookie完成页面显示条目数功能:
<body>
<ul>
{% for item in li %}
<li>{{ item }}</li>
{% endfor %}
{{ page_str }}
</ul>
<div>
<select id="ps" onchange="changePageSize(this)">
<option value="10">10</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
var v = $.cookie('per_page_count'); /* 页面重新加载后获取该值,然后让select的val加载该值*/
$('#ps').val(v)
})
function chanagePageSize(ths) {
var v = $(ths).val();
$.cookie('per_page_count',v,{path: '/user_list'})
location.reload()
}
</script>
</body>
def user_list(request):
val = request.COOKIES.get('per_page_count')
val = int(val) #该值必须为整数
设置cookie可以使用密文设置:
obj = HttpResponse('s')
obj.set_signed_cookie('username','hahaha',salt='abcabcabd') #设置cookie为密文
获取cookie解密:
request.get_signed_cookie('username',salt='abcabcabd')
装饰器:
- FBV:
def auth(func):
def inner(*args,**kwargs):
v = request.COOKIES.get('usernmae')
if not v:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner @auth
- CBV
def auth(func):
def inner(*args,**kwargs):
v = request.COOKIES.get('usernmae')
if not v:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner from django import views
from django.utils.decorators import method_decorator
class Order(views.View): @method_decorator(auth) #只对get方法做认证
def get(self,request):
pass def post(self,request):
只对get方法做认证
def auth(func):
def inner(*args,**kwargs):
v = request.COOKIES.get('usernmae')
if not v:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispath')
class Order(views.View): def get(self,request):
pass def post(self,request):
pass
CBV装饰器方法一
def auth(func):
def inner(*args,**kwargs):
v = request.COOKIES.get('usernmae')
if not v:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner from django import views
from django.utils.decorators import method_decorator class Order(views.View): @method_decorator(auth)
def dispatch(self, request, *args, **kwargs):
return super(Order, self).dispatch(request,*args,**kwargs)
def get(self,request):
pass def post(self,request):
pass
CBV装饰器方法二
5、分页(自定义分页)
防止XSS攻击:默认情况下django只会认为后端传递过来的是字符串,所以html标记、js语言全部当做字符串来处理
为了让django可以接受html或者js语言,可以使用:
1、前端方法:使用filter: {{ str|safe }} //通过safe在前端将html、js转换
2、后端方法:引用 from django.utils.safestring import mark_safe,然后将自定义字符串通过mark_safe方法进行处理
6、Form验证
Python学习笔记第二十一周的更多相关文章
- Python学习笔记第二十三周(Flask架构)
目录: 一.变量引用 内容: 备注:PyCharm小技巧,comm+alt+l 自动修改格式,comm+alt+return 向上添加新行 一.变量引用 1.url生成 from flask im ...
- Python学习笔记第十一周
目录: 1.RabbitMQ 2.Redis 内容: 1.RabbitMQ 实现简单的队列通信 send端 import pika credentials = pika.PlainCredent ...
- Python学习笔记第二十七周(Bootstrap)
目录: 全局样式 一.栅格系统 二.表单 三.按钮 四.导航 五.按钮组 六.面板 七.表格 八.分页 九.排版 十.图片 十一.辅助类 十二.响应式工具 组件 内容: 前言: 首先通过https: ...
- Python学习笔记第二十周
目录: 一.ORM 1.查询补充 备注:forloop.counter介绍 二.Ajax 三.ORM多对多操作 内容: 一.ORM 1.查询补充: 1.models.USR.objects.all() ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- python学习笔记第二周
目录 一.基础概念 1.模块 1)os模块 2)sys模块 2.pyc文件 3.数据类型 1)数字 2)布尔值 3)字符串 4.数据运算 5.运算符 6.赋值运算 7.逻辑运算 8.成员运算 9.身份 ...
- Python学习笔记第二十五周(Django补充)
1.render_to_reponse() 不同于render,render_to_response()不用包含request,直接写template中文件 2.locals() 如果views文件中 ...
- Python学习笔记第二十六周(Django补充)
一.基于jQuery的ajax实现(最底层方法:$.jax()) $.ajax( url: type:''POST“ ) $.get(url,[data],[callback],[type]) #c ...
- Python学习笔记第二十二周(前端知识点补充)
目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 4.列表属性 5.float 6.clear 7.position 8.text-decoration(a标签下划 ...
随机推荐
- 设备指纹(Device Fingerprinting)是什么?
简单来讲,设备指纹是指可以用于标识出该设备的设备特征或者独特的设备标识.设备指纹因子通常包括计算机的操作系统类型,安装的各种插件,浏览器的语言设置及其时区 .设备的硬件ID,手机的IMEI,电脑的网卡 ...
- 在ubuntu14中搭建邮箱服务器
1.前提准备 1.1在服务器上安装ubuntu14 1.2为ubuntu14配置静态ip 使用命令 sudo vim /etc/network/interfaces打开配置文件 修改内容如下: 使用命 ...
- echarts的基本使用
echarts的基本使用 官网:http://echarts.baidu.com/index.html ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移 ...
- C# WinForm通用皮肤
最近做一个小项目,是以前的一个旧项目改造升级,添加些新功能需要用到c#来开发, 话说最近2年都在用Qt开发,c#都生疏不少,赶紧捡起来, 看到原来的就知道需要重新设计,所有打算找一款通用皮肤省事 下面 ...
- ftp主动模式与被动模式交互过程分析
1.相关介绍 1.1主动模式和被动模式 主动模式:服务端通过指定的数据传输端口(默认20),主动连接客户端提交的端口,向客户端发送数据. 被动模式:服务端采用客户端建议使用被动模式,开启数据传输端口的 ...
- summary_20th,Nov 2018
一. 常量: 相对于变量,不改变的量 规定常量名全部大写(实际还是变量) 二:数值的运算符: 1. 算术运算符 + 和, - 减, *乘, / 除(浮点数结果) // 取整, ...
- python图片识别
python 图像处理模块1. 安装 pytesseract模块是会自动安装Pillow模块.pillow 为标准图像处理库 手册地址 http://pillow-cn.readthedocs.io/ ...
- 使用ES6的reduce函数,根据key去重
最近很着迷于ES6的函数,让代码变得更优雅.ES6里的reduce函数,平时用的不是特别多,真正用起来发现还是挺好用的. 想要实现的效果为: 原数组: let rawArr = [{id:'123'} ...
- LTP(LinuxTest Project)测试工具
LTP(LinuxTest Project)是SGI.IBM.OSDL和Bull合作的项目,目的是为开源社区提供一个测试套件,用来验证Linux系统可靠性.健壮性和稳定性.LTP测试套件是测试Linu ...
- OOP⑵
1.问题? 怎么创建对象? 类名 对象名=new 类名(); 在java中只要是看到了()! 这就是方法! 2.构造方法: 创建某个对象的方法! Student stu=new Student(); ...