1.分页:
- 一、自定义
实现:自定义一个分页功能
- 后端代码
"""
分页组件使用示例:
obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info)
page_user_list = USER_LIST[obj.start:obj.end]
page_html = obj.page_html()
return render(request,'index.html',{'users':page_user_list,'page_html':page_html})
"""
class Pagination(object):
def __init__(self,current_page,all_count,base_url,per_page_num=10,pager_count=11):
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param base_url: 分页中显示的URL前缀
:param pager_count: 最多显示的页码个数
"""
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page <1:
current_page = 1
self.current_page = current_page
self.all_count = all_count
self.per_page_num = per_page_num
self.base_url = base_url
# 总页码
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager
self.pager_count = pager_count
self.pager_count_half = int((pager_count - 1) / 2)
@property
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
def page_html(self):
# 如果总页码 < 11个:
if self.all_pager <= self.pager_count:
pager_start = 1
pager_end = self.all_pager + 1
# 总页码 > 11
else:
# 当前页如果<=页面上最多显示11/2个页码
if self.current_page <= self.pager_count_half:
pager_start = 1
pager_end = self.pager_count + 1
# 当前页大于5
else:
# 页码翻到最后
if (self.current_page + self.pager_count_half) > self.all_pager:
pager_end = self.all_pager + 1
pager_start = self.all_pager - self.pager_count + 1
else:
pager_start = self.current_page - self.pager_count_half
pager_end = self.current_page + self.pager_count_half + 1
page_html_list = []
first_page = '<li><a href="%s?page=%s">首页</a></li>' % (self.base_url,1,)
page_html_list.append(first_page)
if self.current_page <= 1:
prev_page = '<li><a href="#">上一页</a></li>'
else:
prev_page = '<li><a href="%s?page=%s">上一页</a></li>' % (self.base_url,self.current_page - 1,)
page_html_list.append(prev_page)
for i in range(pager_start, pager_end):
if i == self.current_page:
temp = '<li class="active"><a href="%s?page=%s">%s</a></li>' % (self.base_url,i, i,)
else:
temp = '<li><a href="%s?page=%s">%s</a></li>' % (self.base_url,i, i,)
page_html_list.append(temp)
if self.current_page >= self.all_pager:
next_page = '<li><a href="#">下一页</a></li>'
else:
next_page = '<li><a href="%s?page=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,)
page_html_list.append(next_page)
last_page = '<li><a href="%s?page=%s">尾页</a></li>' % (self.base_url,self.all_pager,)
page_html_list.append(last_page)
return ''.join(page_html_list)
前端代码:
<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<td>ID</td>
<td>姓名</td>
</tr>
</thead>
<tbody>
{% for item in users %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<!--分页-->
<div style="text-align: center">
<ul class="pagination">
{{ page_html|safe }}
</ul>
</div>
</div>
二、 django 内置(省略)
proporty # 将类中的调用方式改成不加括号
2.编辑或添加后跳转回原来的页面
- request.GET
3.session
- 认证:cookie(保存在客户端的键值对)
用户登录成功后,set_cookie(“is_login”, 1)
问题: 明文信息可能会泄露
解决方案:
a、 签名cookie
b、Session
- Session: 保存在服务器端的键值对,(依赖于cookie)
session中写入数据:
request.session['username'] = XXX
session中获取数据:
request.session.get("XXX")
删除session
request.session.delete()
删除session中单个内容(以单单删除密码为例)
del request.session['pwd']
示例:
def login(request): # 设置session
if request.method == 'POST':
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == 'xxx' and pwd == 'xxx':
# 写session 数据, 把用户的姓名和id写到session里面
request.session['user'] = user
request.session['id'] = id
return redirect('/index/')
return render(request, 'index.html')
def logout(request):
request.session.delete() # 删除session,(原理:先获取用户发过来的session随机字符串,然后去数据库中删除该字符串,即删除键值对。)
return redirect('/login/')
def index(request):
user = request.session.get('user') # 获取session中的值
if user:
obj = Pagination(request.GET.get('page', 1), len(USER_LIST), request.path_info)
page_user_list = USER_LIST[obj.start:obj.end]
page_html = obj.page_html()
return render(request, "index.html", {"users": page_user_list, 'page_html': page_html})
else:
return redirect('/login/')
django中settings.py 文件中的session配置信息
# ################# session 配置信息 ###################
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认------放数据库)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎( -----放缓存)
# SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
# SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎(-------放文件)
# SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址#
# tempfile.gettempdir()
# SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎(数据库+缓存)
# SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎(放cookie中)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
# SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = True # 保存最后一次刷新页面的时间,(与失效时间配合,失效时间内未请求页面则需要从新登录)
总结: session
使用
a.创建保存session的表
python manage.py makemigrations
python manage.py migrate
b.在session中设置数据
request.session['xxx'] = 'xxx'
request.session['xxx'] = 'xxx'
request.session['xxx'] = 'xxx'
request.session['xxx'] = 'xxx'
c.读取
request.session.get('xxx')
e. 删除
del request.session['xxx']
reqeust.session.delete()
比较:和签名的cookie和session的比较:相比较cookie更安全,但是要浪费自己的内存。
session的原理:pass
4.csrf跨域伪造请求
{{ XXX|safe}}
5.中间件
- 用户登录认证
- 权限系统
6.django的请求声明周期
浏览器 --> ngix --> uwsgi --> 中间件 --> 路由 --> 视图 --> 数据库
7.request中的方法:
request.GET.get("")
request.POST.get("")
request.path
request.path_info
request.get_full_path
request.is_ajax()
request.body() #----字节串
request.method
request.COOKIE
request.session
8 响应对象
Httpresponse
render
redirect
-
django中的模板语法。
a.创建一个base.html 用户将多次重复的内容进行继承,然后构建{% block content%} 其他内容 {% endblock%} 。
b. 创建子模板 ,需要使用{% extends ‘base.html’ %} 然后在{% block content %} 替换对应的内容 {%block end%}
其中在创建的子模板中 需要将之前的内容如果也继承过来, 则在其中加入 {{block. super}}。
c. safe 声明是安全信息,渲染的时候按照内容本身渲染,
用法:{{obj| safe}
d. slice 截取部分内容,包含省略号字符数
用法:{{obj|slice:‘2:’}}
e.truncatechars、truncatewords、 按照字符、单词截取部分内容,不包含省略号字符数
f. data 日期方法
用法{{obj|data:‘Y-m-d H:M:S’}} 自己定义日期格式
g.add 加法
用法{{obj| add:5}} 加5操作
h.defualt 默认参数方法
用法{{obj|defualt:‘xxx’}} 如果内容存在则显示内容,不存在显示‘xxx’
i.length 求取对象的长度
用法{{value|length}}
j.fileSize 文件大小
用法如下:
o.其他示例如下:
-
ajax发送请求(解决跨域方式一)
$("#submit").on("click", function(){
url: /login/,
type:post,
data:{
user: $("#user").val,
pwd: $("#pwd").val,
csrftokenmidowwel: $("[name='csrftokenmidowwel']").val //获取到服务器端发过来的令牌
},
scusses:function(data){
var data = JSON.parse(data),
if (data.user){
location.href = '/index/'
}else{
$("#error").html(data.error_msg).css("color", "red")
};
setTimeout(function(){
$(".error").html("")
},2000)
},
});
- 模板中的序列。
12.模型中的联合唯一
- 模型中的F函数,用户字段的加减操作
13 模型中的实务(实务是实现两个操作都完成的情况下则完成,否则就返回到之前的操作)
引入:
使用: