(一)数据分页 

可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/

模板:如果只要显示 1、2、3、4、5、6.。。。的话,在模板中加上 第8、9、10行就行了

 <span class="step-links">
{# 如果有上一页,返回true #}
{% if posts.has_previous %}
<a href="?page=1">&laquo;首页 </a>
<a href="/blog/?page={{ posts.previous_page_number }}">上一页</a>
{% endif %}</span>
{# posts.paginator.page_range 返回页码可迭代范围 ,例如有5页,这时候和range(1,5)是一样的。[1,2,3,4] #}
{% for post_num in posts.paginator.page_range %}
<a href="/blog/?page={{ post_num }}">{{ post_num }}</a>
{% endfor %}
<span class="current">
{# 如果有下一页,返回true#}
{% if posts.has_next %}
<a href="/blog/?page={{ posts.next_page_number }}">下一页</a>
<a href="/blog/?page={{ posts.paginator.num_pages }}">尾页 &raquo;</a>
{% endif %}
</span>
<span class="current">
Page {{ posts.number }} of {{ posts.paginator.num_pages }}
</span>

视图函数(views.py):

 from blog.models import BlogPost
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #获取博客信息并渲染到页面上
def archive(request):
#获取 BlogPost的所有数据并按timestamp倒序排序,timestamp相同则根据title排序
all_posts = BlogPost.objects.all().order_by('-timestamp','title')
#实例化Paginator,限制每页显示10条数据
paginator = Paginator(all_posts, 10)
#获取用户选择的页码
page = request.GET.get('page')
try:
posts = paginator.page(page)#获取page页的数据
except PageNotAnInteger:#页码不为整数则获取第一页数据
posts = paginator.page(1)
except EmptyPage:#超出最大页码则获取最后一页的数据
posts = paginator.page(paginator.num_pages)
#return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))
return render(request,'archive.html',{'posts': posts,})

(二)跨站点请求伪造(Cross-Site Request Forgery,CSRF)

不允许POST、PUT和DELATE等不安全的请求方式通过跨站点请求伪造来进行攻击可以参考https://docs.djangoproject.com/en/2.0/ref/csrf/

1、项目文件下的settings.py 的MIDDLEWARE 列表的'django.middleware.csrf.CsrfViewMiddleware', 没有被注释 (django 2.0.5是默认启用的)

2、模板文件的<form>标签后面增加{% csrf_token %},例如:第一行最后面的那个就是了

 <form action="/blog/create/" method="post">{% csrf_token %}
<table>{{ form }}</table><br>
<input type=submit>
</form>

3、请求类型修改为 RequestContext

 from django.shortcuts import render,render_to_response
from blog.models import BlogPost,BlogPostForm
from django.template import RequestContext #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request))

django 文档说明的一种方式应该就是上面这种写法render_to_response('archive.html', {'posts': posts,'form':BlogPostForm},RequestContext(request)),不过我试了下是没什么用,后面换render函数可以了(render函数请求类型就是RequestContext ,所以不用另外指定了)

from django.shortcuts import render
from blog.models import BlogPost,BlogPostForm #获取博客信息并渲染到页面上
def archive(request):
posts = BlogPost.objects.all().order_by('-timestamp','title')
return render(request,'archive.html',{'posts': posts,'form':BlogPostForm})

Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造的更多相关文章

  1. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

  2. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  3. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  4. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  5. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  6. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  7. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  8. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  9. django上课笔记3-ORM补充-CSRF (跨站请求伪造)

    一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...

随机推荐

  1. Python:Windows8下安装BeautifulSoup

    运行环境:Windows 8.1 Python:2.7.6 在安装的时候,我使用的pip来进行安装,命令如下: pip install beautifulsoup4 运行的时候,报错如下: Excep ...

  2. Intellij添加Jetty远程Debug

    步骤一: 步骤二: 步骤三:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15005 步骤四: 找到服务器上jetty的b ...

  3. StreamSets学习系列之StreamSets的Core Tarball方式安装(图文详解)

    不多说,直接上干货! 前期博客 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel .Full Tarball .Full R ...

  4. Hibernate的Api以及三种查询方式

    Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) ...

  5. curl 详解【转】

    原文:https://blog.csdn.net/lansesl2008/article/details/14523303 用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等 ...

  6. Visual Studio自带的的Developer Command Prompt对话框

    简单了解Visual Studio的Developer Command Prompt VS2008的命令为:Visual Studio 2008 Command Prompt 目录是: 其详细信息如下 ...

  7. C#调用百度地图API经验分享(二)

    接着上一篇,将上一篇代码的js提取出来:<script type="text/JavaScript">var map = new BMap.Map("allm ...

  8. Join 具体用法

    一.Join 语法概念 Join 按照功能可分为三大类: left join (左连接) 即:取左边表的全部数据,即使右边表没有对应的数据,也是会把左边表的数据取出来,并返回 right join(右 ...

  9. UML,构件图与部署图

    一.构件图概述 1.概念 用来显示一组构件之间的组织及其依赖关系 2.基本元素 (1)构件:定义了良好接口的物理实现单元. ● 配置构件:形成可执行文件的基础,如:动态链接库(DLL).ActiveX ...

  10. 简单的SpringMVC经典案例

    主题:构建一个基于SpringMVC的HelloWord Web 项目 目的:快速体验什么是SpringMVC 方案: 1.创建工程,命名:SpringMVC 2.导包 3.在SRC下添加spring ...