django中的分页、跳转、session、csrf、中间件

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
  1. 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.其他示例如下:
    在这里插入图片描述

  2. 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)
	},
});
  1. 模板中的序列。
    在这里插入图片描述
    12.模型中的联合唯一
    在这里插入图片描述
  2. 模型中的F函数,用户字段的加减操作
    在这里插入图片描述
    13 模型中的实务(实务是实现两个操作都完成的情况下则完成,否则就返回到之前的操作)
    引入:
    在这里插入图片描述
    使用:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值