批量插入数据;分页的推导原理和使用;django操作cookie;django操作session # day58

批量插入数据

第一种插入方式(插入多少条数据就要操作多少次数据库,效率低,不推荐使用)

for i in range(10000):
models.Book.objects.create(title='%s本书' % i)

第二种插入方式(循环大量的对象,通过bulk.create方法一次性插入数据,只操作一次数据库,效率高,推荐使用)

book = []
for i in range(1):
book_obj = models.Book(title='%s' % i)
book.append(book_obj)
models.Book.objects.bulk_create(book)  # 相当于SQL语句 insert into values(),(),(),()...

扩展:

1、批量删除数据

models.Book.objects.filter(id__gt=0).delete()

2、只要是能不查库能解决问题的问题,就尽量不要查询(数据库中数据量大的时候,非常影响性能)

分页的推导原理

做分页必须需要的参数:

1、当前页  ?page=1

2、总数量   count 

3、per_page_num    默认每页显示多少条数据

4、总页数 = 总数量/per_page_num

分页的使用

终极大法

我们不需要掌握代码的编写,只需要掌握基本用法即可

自定义分页器封装代码

class Pagination(object):
    def __init__(self, current_page, all_count, per_page_num=2, pager_count=11):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :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

        # 总页码
        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 = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
        page_html_list.append(first_page)

        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page=%s">上一页</a></li>' % (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="?page=%s">%s</a></li>' % (i, i,)
            else:
                temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
            page_html_list.append(temp)

        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
        page_html_list.append(next_page)

        last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)

自定义分页器使用

后端

在使用时需将上面的封装代码复制在项目文件下,再通过导入的方式进行使用

eg:from utils.mypage import Pagination
 def get_book(request):
   book_list = models.Book.objects.all()
   current_page = request.GET.get("page",1)
   all_count = book_list.count()
   page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10)
   page_queryset = book_list[page_obj.start:page_obj.end]
   return render(request,'booklist.html',locals())

前端

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            {% for book in page_queryset %}
            <p>{{ book.title }}</p>
            {% endfor %}
            {{ page_obj.page_html|safe }}
        </div>
    </div>
</div>

 

django操作cookie

1、无状态

2、保存用户信息(可以实现三次输错锁定的需求)

3、cookie的保存位置:浏览器客户端

    保存方式:k:v键值对

    可以存储多个值

    不安全

4、设置cookie

  基于HttpResponse对象

  obj = HttpResponse()

  obj = redirect()

  obj.set_cookie('k', 'v')

  设置失效时间

  obj.set_cookie('k', 'v', max_age=3)  # 3秒后失效

5、获取cookie

  response.COOKIES.get('k')

6、删除cookie(可用于注销功能)

  obj.delete_cookie('k')  

django操作session  

session:

  为了解决数据安全性诞生的,cookie不安全

  数据在服务端存储

  session的存储默认存储到django_session表

  如果说,你想存储session,必须有django_session表

  seeeion的用法还是基于cookie的 

  浏览器可以禁用cookie

 

面试题:

  如果浏览器禁用了cookie,那么session是否一定不能用?如果不能用,给出解决方案

 

如何设置session
request.session['username'] = 'ly'
request.session['username1'] = 'ly1'
request.session['username2'] = 'ly2'

设置过期时间
request.session.set_expiry(3)

设置过期时间:
1. 整数, 多少秒
2. 日期、具体的时间, 到这个时间失效
3. 0 ,永不失效, 直到浏览器关闭
print(request.session.get('username'))
print(request.session.get('username1'))
print(request.session.get('username2'))


删除session
request.session.flush() # 清空session, 全部清空
request.session.delete() # 只清空服务端

request.session['username'] = 'ly'
发生了什么事?
1. 生成随机字符串
2. 将数据进行加密,存储到数据表中
3. 将生成的随机字符串返回给浏览器保存起来

request.session.get('username')
获取session发生了那些事?
1. 从浏览器获取sessionid, =》 随机字符串
2. 去数据表中查询session信息
3. 将加密的数据进行解密
4. 将查询到的数据封装到request.session对象中

一台电脑在一个浏览器中存储的所有session信息,都只有一条记录
一台电脑在两个浏览器中存储session,有两条

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



posted @ 2021-08-20 16:37  Gnomeshghy  阅读(107)  评论(0)    收藏  举报