Django进阶
?内容简介:
,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。 。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.db</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 引擎(默认)</span>
<span style="color: #000000;"> SESSION_COOKIE_PATH = <span style="color: #800000;">"<span style="color: #800000;">/<span style="color: #800000;">" <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False <span style="color: #008000;">#<span style="color: #008000;"> 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True <span style="color: #008000;">#<span style="color: #008000;"> 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False <span style="color: #008000;">#<span style="color: #008000;"> 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False <span style="color: #008000;">#<span style="color: #008000;"> 是否每次请求都保存Session,默认修改之后才保存(默认),最好设置为True,这样超时时间都是最新的 SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.cache</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 引擎</span>
SESSION_CACHE_ALIAS = <span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置</span>
<span style="color: #000000;">
SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.file</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 引擎</span>
SESSION_FILE_PATH = None <span style="color: #008000;">#</span><span style="color: #008000;"> 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T</span>
SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.signed_cookies</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 引擎</span></pre>
django中的中间件,在其他web框架中,有的叫管道或者httphandle,Django中很多功能都是通过中间件实现的,实际上中间件就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在工程中的settings.py中由变量MIDDLEWARE控制,请求从上到下依次穿过中间件,每个中间件中都可以有5个方法:
2、请求在中间件中的方法请求过程
大致的请求过程: ?3、自定义中间件自定义中间件,我们至少包括两个方法,一个是process_request,还有一个是process_response,创建一个py文件,在工程中创建MyMiddleWare目录(与tempates同级),创建文件md.py,注意使用process_response必须返回response:
django.utils.deprecation django.shortcuts <span style="color: #008000;">#<span style="color: #008000;">中间件1
<span style="color: #0000ff;">class<span style="color: #000000;"> Row1(MiddlewareMixin): <span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request): <span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件1请求<span style="color: #800000;">"<span style="color: #000000;">) <span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response): <span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件1返回<span style="color: #800000;">"<span style="color: #000000;">) <span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #008000;">#<span style="color: #008000;">中间件2 <span style="color: #008000;">#<span style="color: #008000;">中间件3
注册中间件:使用中间件需要在settings.py中注册你的中间件,配置就是你的中间件文件路径 MIDDLEWARE =
4、版本变化上面所说的Django中间件请求过程是在1.10版本之后(包括1.10),而在1.10版本之前稍微有些区别,区别就在请求异常时候, 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者memchazhe中之前缓存的内容拿到,并返回。 Django提供了6种缓存方式:
缓存方式配置?通用配置
CACHES =: ,
: 300,
: 300,
: 3,
: ,
: 1,
函数名
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 自定义key</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> default_key_func(key,key_prefix,version):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
Default function to generate keys.
Constructs the key used by all other methods. By default it prepends
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
function with custom key making behavior.
</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">return</span> <span style="color: #800000;">'</span><span style="color: #800000;">%s:%s:%s</span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (key_prefix,version,key)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_key_func(key_func):
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
Function to decide which key function to use.
Defaults to ``default_key_func``.
</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">if</span> key_func <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> None:
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> callable(key_func):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> key_func
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> import_string(key_func)
</span><span style="color: #0000ff;">return</span> default_key_func</pre>
使用内存
CACHES =: :
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 注:其他配置同开发调试版本</span></pre>
使用文件
=: :
使用数据库
<span style="color: #000000;"> }
使用memcache缓存(python-memcached模块)
=: :
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">unix:/tmp/memcached.sock</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
}
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span><span style="color: #000000;">: [
</span><span style="color: #800000;">'</span><span style="color: #800000;">172.19.26.240:11211</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">172.19.26.242:11211</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
}
}</span></pre>
使用Memcache缓存(pylibmc模块)
=:
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">LOCATION</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">/tmp/memcached.sock</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
}
CACHES </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">BACKEND</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
}
}</span></pre>
缓存应用?单独视图缓存 <span style="color: #0000ff;">from django.views.decorators.cache <span style="color: #0000ff;">import<span style="color: #000000;"> cache_page
@cache_page(60 * 15<span style="color: #000000;">) 方式二:
即通过装饰器的方式实现,导入模块之后,在需要缓存的函数前加@cache_page(60 15) 6015表示缓存时间是15分钟 局部使用 {</span>% load cache %<span style="color: #000000;">}
b. 使用缓存
全站缓存 MIDDLEWARE </span>=<span style="color: #000000;"> [
</span><span style="color: #800000;">'</span><span style="color: #800000;">django.middleware.cache.UpdateCacheMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #008000;">#</span><span style="color: #008000;"> 其他中间件...</span>
<span style="color: #800000;">'</span><span style="color: #800000;">django.middleware.cache.FetchFromCacheMiddleware</span><span style="color: #800000;">'</span><span style="color: #000000;">,]
CACHE_MIDDLEWARE_ALIAS </span>= <span style="color: #800000;">""</span><span style="color: #000000;">
CACHE_MIDDLEWARE_SECONDS </span>= <span style="color: #800000;">""</span><span style="color: #000000;">
CACHE_MIDDLEWARE_KEY_PREFIX </span>= <span style="color: #800000;">""</span></pre>
<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0"> <tr><td><span style="font-size: 16px;">七、Django中的信号</td> </tr></table> 简介Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。 内置信号
post_init
pre_save
post_save
pre_delete
post_delete
m2m_changed
class_prepared
post_migrate
Request/
request_finished
got_request_exception
template_rendered
因为这些信号中并没有注册函数,所以运行时并没有调用触发这些信号 对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数 django.core.signals request_finished
django.core.signals request_started
django.core.signals got_request_exception
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import class_prepared <span style="color: #008000;">#<span style="color: #008000;"> 程序启动时,检测已注册的app中的modal类,对于每一个类,自动触发<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_init,post_init <span style="color: #008000;">#<span style="color: #008000;"> 构造方法前和构造方法后 <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_save,post_save <span style="color: #008000;">#<span style="color: #008000;"> 对象保存前和对象保存后 <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_delete,post_delete <span style="color: #008000;">#<span style="color: #008000;"> 对象删除前和对象删除后 <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import m2m_changed <span style="color: #008000;">#<span style="color: #008000;"> 操作第三张表前后 <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_migrate,post_migrate <span style="color: #008000;">#<span style="color: #008000;"> 执行migrate命令前后 <span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import setting_changed <span style="color: #008000;">#<span style="color: #008000;"> 使用test测试修改配置文件时 <span style="color: #0000ff;">from django.db.backends.signals <span style="color: #0000ff;">import connection_created <span style="color: #008000;">#<span style="color: #008000;"> 创建数据库连接时 <span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs): xxoo.connect(callback) from django.core.signals import request_finished from django.dispatch import receiver 自定义信号步骤:
示例:
=django.dispatch.Signal(providing_args=[,<span style="color: #008000;">#<span style="color: #008000;">注册信号 <span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs):
pizza_done.connect(callback) <span style="color: #008000;">#<span style="color: #008000;">触发信号<span style="color: #0000ff;">from 路径 <span style="color: #0000ff;">import<span style="color: #000000;"> pizza_done pizza_done.send(sender =<span style="color: #800000;">'<span style="color: #800000;">seven<span style="color: #800000;">',toppings=123,size=456)(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
request.COOKIES[]
request.COOKIES.get()
request.get_signed_cookie(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',salt=<span style="color: #800000;">'<span style="color: #800000;">adada<span style="color: #800000;">')
<span style="color: #0000ff;">if request.method==<span style="color: #800000;">"<span style="color: #800000;">GET<span style="color: #800000;">"<span style="color: #000000;">:
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">'<span style="color: #800000;">login.html<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">if request.method==<span style="color: #800000;">"<span style="color: #800000;">POST<span style="color: #800000;">"<span style="color: #000000;">:
u=request.POST.get(<span style="color: #800000;">'<span style="color: #800000;">user<span style="color: #800000;">'<span style="color: #000000;">)
p=request.POST.get(<span style="color: #800000;">'<span style="color: #800000;">pwd<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">print<span style="color: #000000;">(u,p)
<span style="color: #0000ff;">if u==<span style="color: #800000;">'<span style="color: #800000;">admin<span style="color: #800000;">' <span style="color: #0000ff;">and p==<span style="color: #800000;">'<span style="color: #800000;">admin<span style="color: #800000;">'<span style="color: #000000;">:
response=redirect(<span style="color: #800000;">'<span style="color: #800000;">/app01/index/<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">response.set_cookie('username',u,max_age=60*60)#设置一个小时以后cookie失效
<span style="color: #0000ff;">import<span style="color: #000000;"> datetime
current_date=<span style="color: #000000;">datetime.datetime.now()
expre_date=current_date+datetime.timedelta(seconds=5<span style="color: #000000;">)
response.set_cookie(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',expires=expre_date) <span style="color: #008000;">#<span style="color: #008000;"> 设置5秒后cookie过期
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">else<span style="color: #000000;">:
<span style="color: #0000ff;">return redirect(<span style="color: #800000;">'<span style="color: #800000;">/app01/login/<span style="color: #800000;">')
})
<span style="color: #0000ff;"></<span style="color: #800000;">script<span style="color: #0000ff;">><span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>
<span style="color: #000000;">@auth
<span style="color: #0000ff;">def<span style="color: #000000;"> index(reqeust):<span style="color: #0000ff;">return render(reqeust,{<span style="color: #800000;">'<span style="color: #800000;">current_user<span style="color: #800000;">': v})
<span style="color: #0000ff;">from
django <span style="color: #0000ff;">import<span style="color: #000000;"> views<span style="color: #0000ff;">from django.utils.decorators <span style="color: #0000ff;">import<span style="color: #000000;"> method_decorator
@method_decorator(auth,name=<span style="color: #800000;">'<span style="color: #800000;">dispatch<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> 第三种方法,name="dispatch",就是给dispatch方法加上此装饰器,作用在于在执行post、get方法之前就验证,避免在给post和get方法加装饰器
<span style="color: #0000ff;">class<span style="color: #000000;"> Order(views.View):
<span style="color: #008000;">#<span style="color: #008000;"> @method_decorator(auth) # 第二种方法,作用等同于等三种
<span style="color: #008000;">#<span style="color: #008000;"> def dispatch(self,request,kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> return super(Order,self).dispatch(request,kwargs)
<span style="color: #008000;">#<span style="color: #008000;"> @method_decorator(auth) # 第一种方法,作用可以用针对性,可以只给get方法加装饰器
<span style="color: #0000ff;">def<span style="color: #000000;"> get(self,reqeust):<span style="color: #0000ff;">return render(reqeust,{<span style="color: #800000;">'<span style="color: #800000;">current_user<span style="color: #800000;">'<span style="color: #000000;">: v})
<span style="color: #0000ff;">def<span style="color: #000000;"> post(self,{<span style="color: #800000;">'<span style="color: #800000;">current_user<span style="color: #800000;">': v})
<span style="color: #008000;">#
<span style="color: #008000;">设置sessionrequest.session[<span style="color: #800000;">'<span style="color: #800000;">k1<span style="color: #800000;">']=<span style="color: #800000;">'<span style="color: #800000;">wd<span style="color: #800000;">'<span style="color: #000000;">
request.session.setdefault(<span style="color: #800000;">'<span style="color: #800000;">key<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">value<span style="color: #800000;">') <span style="color: #008000;">#<span style="color: #008000;">存在则不设置
<span style="color: #008000;">#<span style="color: #008000;">删除某个session键值
<span style="color: #0000ff;">del request.session[<span style="color: #800000;">'<span style="color: #800000;">key<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #008000;">#<span style="color: #008000;">循环session中的字典,与字典循环类似
request.session.keys() <span style="color: #008000;">#<span style="color: #008000;">所有的key
request.session.values() <span style="color: #008000;">#<span style="color: #008000;">所有的value
request.session.items() <span style="color: #008000;">#<span style="color: #008000;">k,v形式
request.session.iterkeys() <span style="color: #008000;">#<span style="color: #008000;">所有的key
request.session.itervalues() <span style="color: #008000;">#<span style="color: #008000;">所有的value
request.session.iteritems() <span style="color: #008000;">#<span style="color: #008000;">k,v形式
<span style="color: #008000;">#<span style="color: #008000;">获取用户session中的随机字符串
<span style="color: #000000;">request.session.session_key
<span style="color: #008000;">#<span style="color: #008000;">删除所有session失效日期小于当前日志的数据(删除同一用户制造的脏数据)
<span style="color: #000000;">request.session.clear_expired()
<span style="color: #008000;">#<span style="color: #008000;">删除当前用户的所有session数据(在用户退出登录时候使用)
request.session.delete(<span style="color: #800000;">'<span style="color: #800000;">用户随机字符串<span style="color: #800000;">')<span style="color: #008000;">#<span style="color: #008000;">使用比较麻烦,因为还的获取用户随机字符串
request.session.clear()<span style="color: #008000;">#<span style="color: #008000;">该方法会先获取用户的随机字符串,然后把其对应的所有数据删除,推荐注销(退出登录)时候使用<span style="color: #008000;">
<span style="color: #008000;">设置seesion失效时间
<span style="color: #000000;">request.session.set_expiry(value)
<span style="color: #000000;"> 如果value是个整数,session会在些秒数后失效。
<span style="color: #000000;"> 如果value是个datatime或timedelta,session就会在这个时间后失效。
<span style="color: #000000;"> 如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略,默认全局两周失效
SESSION_ENGINE </span>= <span style="color: #800000;">'</span><span style="color: #800000;">django.contrib.sessions.backends.cached_db</span><span style="color: #800000;">'</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 引擎</span></pre>
<span style="color: #0000ff;">for i <span style="color: #0000ff;">in range(999<span style="color: #000000;">):
L.append(i) <span style="color: #0000ff;">def<span style="color: #000000;"> index(request):
current_page = request.GET.get(<span style="color: #800000;">'<span style="color: #800000;">p<span style="color: #800000;">'<span style="color: #000000;">)
paginator </span>= Paginator(L,10<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> per_page: 每页显示条目数量</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> count: 数据总个数</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> num_pages:总页数</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> page_range:总页数的索引范围,如: (1,10),(1,200)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> page: page对象</span>
<span style="color: #0000ff;">try</span><span style="color: #000000;">:
posts </span>=<span style="color: #000000;"> paginator.page(current_page)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> has_next 是否有下一页</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> next_page_number 下一页页码</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> has_previous 是否有上一页</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> previous_page_number 上一页页码</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> object_list 分页之后的数据列表</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> number 当前页</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> paginator paginator对象</span>
<span style="color: #0000ff;">except</span><span style="color: #000000;"> PageNotAnInteger:
posts </span>= paginator.page(1<span style="color: #000000;">)
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> EmptyPage:
posts </span>=<span style="color: #000000;"> paginator.page(paginator.num_pages)
</span><span style="color: #0000ff;">return</span> render(request,{<span style="color: #800000;">'</span><span style="color: #800000;">posts</span><span style="color: #800000;">'</span>: posts})</pre>
- % item posts %
- {{ item }} % endfor %
<div <span style="color: #0000ff;">class
=<span style="color: #800000;">"<span style="color: #800000;">pagination<span style="color: #800000;">"><span <span style="color: #0000ff;">class=<span style="color: #800000;">"<span style="color: #800000;">step-links<span style="color: #800000;">"><span style="color: #000000;">
{% <span style="color: #0000ff;">if posts.has_previous %<span style="color: #000000;">}
<a href=<span style="color: #800000;">"<span style="color: #800000;">?p={{ posts.previous_page_number }}<span style="color: #800000;">">Previous<span style="color: #000000;">
{% endif %<span style="color: #000000;">}
<span <span style="color: #0000ff;">class=<span style="color: #800000;">"<span style="color: #800000;">current<span style="color: #800000;">"><span style="color: #000000;">
Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
<span style="color: #000000;">
{% <span style="color: #0000ff;">if posts.has_next %<span style="color: #000000;">}
<a href=<span style="color: #800000;">"<span style="color: #800000;">?p={{ posts.next_page_number }}<span style="color: #800000;">">Next<span style="color: #000000;">
{% endif %<span style="color: #000000;">}
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,current_page,max_pager_num,*<span style="color: #000000;">kwargs):
<span style="color: #800000;">"""<span style="color: #800000;">
:param current_page: 当前页
:param max_pager_num:最多显示的页码个数
:param args:
:param kwargs:
:return:
<span style="color: #800000;">"""<span style="color: #000000;">
self.current_page =<span style="color: #000000;"> int(current_page)
self.max_pager_num =<span style="color: #000000;"> max_pager_num
super(CustomPaginator,self).<span style="color: #800080;">init(args,**<span style="color: #000000;">kwargs)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> page_num_range(self):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 当前页面</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> self.current_page</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 总页数</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> self.num_pages</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 最多显示的页码个数</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> self.max_pager_num</span>
<span style="color: #0000ff;">print</span>(1<span style="color: #000000;">)
</span><span style="color: #0000ff;">if</span> self.num_pages <<span style="color: #000000;"> self.max_pager_num:
</span><span style="color: #0000ff;">return</span> range(1,self.num_pages + 1<span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span>(2<span style="color: #000000;">)
part </span>= int(self.max_pager_num / 2<span style="color: #000000;">)
</span><span style="color: #0000ff;">if</span> self.current_page - part < 1<span style="color: #000000;">:
</span><span style="color: #0000ff;">return</span> range(1,self.max_pager_num + 1<span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span>(3<span style="color: #000000;">)
</span><span style="color: #0000ff;">if</span> self.current_page + part ><span style="color: #000000;"> self.num_pages:
</span><span style="color: #0000ff;">return</span> range(self.num_pages + 1 - self.max_pager_num,self.num_pages + 1<span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span>(4<span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> range(self.current_page - part,self.current_page + part + 1<span style="color: #000000;">)
L =<span style="color: #000000;"> []
<span style="color: #0000ff;">for i <span style="color: #0000ff;">in range(999<span style="color: #000000;">):
L.append(i)
<span style="color: #0000ff;">def<span style="color: #000000;"> index(request):
current_page = request.GET.get(<span style="color: #800000;">'<span style="color: #800000;">p<span style="color: #800000;">'<span style="color: #000000;">)
paginator = CustomPaginator(current_page,11,L,200)
<span style="color: #008000;">#<span style="color: #008000;"> page: page对象
<span style="color: #0000ff;">try<span style="color: #000000;">:
posts =<span style="color: #000000;"> paginator.page(current_page)
<span style="color: #008000;">#<span style="color: #008000;"> has_next 是否有下一页
<span style="color: #008000;">#<span style="color: #008000;"> next_page_number 下一页页码
<span style="color: #008000;">#<span style="color: #008000;"> has_previous 是否有上一页
<span style="color: #008000;">#<span style="color: #008000;"> previous_page_number 上一页页码
<span style="color: #008000;">#<span style="color: #008000;"> object_list 分页之后的数据列表
<span style="color: #008000;">#<span style="color: #008000;"> number 当前页
<span style="color: #008000;">#<span style="color: #008000;"> paginator paginator对象
<span style="color: #0000ff;">except<span style="color: #000000;"> PageNotAnInteger:
posts = paginator.page(1<span style="color: #000000;">)
<span style="color: #0000ff;">except<span style="color: #000000;"> EmptyPage:
posts =<span style="color: #000000;"> paginator.page(paginator.num_pages)
</span><span style="color: #0000ff;">return</span> render(request,{<span style="color: #800000;">'</span><span style="color: #800000;">posts</span><span style="color: #800000;">'</span>: posts})</pre>
- % item posts %
- {{ item }} % endfor %
<div <span style="color: #0000ff;">class
=<span style="color: #800000;">"<span style="color: #800000;">pagination<span style="color: #800000;">"><span <span style="color: #0000ff;">class=<span style="color: #800000;">"<span style="color: #800000;">step-links<span style="color: #800000;">"><span style="color: #000000;">
{% <span style="color: #0000ff;">if posts.has_previous %<span style="color: #000000;">}
<a href=<span style="color: #800000;">"<span style="color: #800000;">?p={{ posts.previous_page_number }}<span style="color: #800000;">">Previous<span style="color: #000000;">
{% endif %<span style="color: #000000;">}
{</span>% <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> posts.paginator.page_num_range %<span style="color: #000000;">}
</span><a href=<span style="color: #800000;">"</span><span style="color: #800000;">?p={{ i }}</span><span style="color: #800000;">"</span>>{{ i }}</a><span style="color: #000000;">
{</span>% endfor %<span style="color: #000000;">}
{</span>% <span style="color: #0000ff;">if</span> posts.has_next %<span style="color: #000000;">}
</span><a href=<span style="color: #800000;">"</span><span style="color: #800000;">?p={{ posts.next_page_number }}</span><span style="color: #800000;">"</span>>Next</a><span style="color: #000000;">
{</span>% endif %<span style="color: #000000;">}
<span <span style="color: #0000ff;">class=<span style="color: #800000;">"<span style="color: #800000;">current<span style="color: #800000;">"><span style="color: #000000;">
Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
</span><span style="color: #0000ff;">def</span> page_str(self,base_url): <span style="color: #008000;">#</span><span style="color: #008000;">获取最后展现的a标签字符串</span>
<span style="color: #800000;">'''</span><span style="color: #800000;">
:param base_url: 跳转链接地址
:return: 返回django认可的html代码
</span><span style="color: #800000;">'''</span><span style="color: #000000;">
page_list</span>=<span style="color: #000000;">[]
half_index </span>= int(self.show_index_num/2) <span style="color: #008000;">#</span><span style="color: #008000;"> 显示页码数的一半</span>
<span style="color: #0000ff;">if</span> self.total_index < self.show_index_num: <span style="color: #008000;">#</span><span style="color: #008000;"> 起始页码小于显示的页码数目,结束页码则为总显示页数</span>
start_index = 1<span style="color: #000000;">
end_index </span>= self.total_index+1
<span style="color: #0000ff;">else</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">if</span> self.current_index < half_index <span style="color: #0000ff;">or</span> self.current_index == half_index:<span style="color: #008000;">#</span><span style="color: #008000;">当前页码小于或等于显示页码数量的一半</span>
start_index = 1<span style="color: #000000;">
end_index </span>= self.show_index_num + 1
<span style="color: #0000ff;">else</span><span style="color: #000000;">:
start_index </span>= self.current_index - half_index + 1
<span style="color: #0000ff;">if</span> self.current_index + half_index > self.total_index:<span style="color: #008000;">#</span><span style="color: #008000;">当前页码+显示页码数的一半大于总的页码数目</span>
start_index = self.total_index - self.show_index_num + 1<span style="color: #000000;">
end_index </span>= self.total_index + 1
<span style="color: #0000ff;">else</span><span style="color: #000000;">:
end_index </span>= self.current_index + half_index + 1
<span style="color: #0000ff;">if</span> self.current_index == 1<span style="color: #000000;">:
page_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><a class="pg-a" href="javascript:void(0);">上一页</a></span><span style="color: #800000;">'</span>)<span style="color: #008000;">#</span><span style="color: #008000;">javascript:void(0)意思是不错任何操作</span>
<span style="color: #0000ff;">else</span><span style="color: #000000;">:
page_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><a href=%s?p=%s class="pg-a alive">上一页</a></span><span style="color: #800000;">'</span> % (base_url,self.current_index - 1<span style="color: #000000;">,))
</span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span><span style="color: #000000;"> range(start_index,end_index):
</span><span style="color: #0000ff;">if</span> i ==<span style="color: #000000;"> self.current_index:
page_url </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><a href=%s?p=%s class="pg-a alive">%s</a></span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (base_url,i,i)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
page_url </span>= <span style="color: #800000;">'</span><span style="color: #800000;"><a href=%s?p=%s class="pg-a ">%s</a></span><span style="color: #800000;">'</span> %<span style="color: #000000;"> (base_url,i)
page_list.append(page_url)
</span><span style="color: #0000ff;">if</span> self.current_index ==<span style="color: #000000;"> self.total_index:
page_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><a class="pg-a" href="javascript:void(0);">下一页</a></span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
page_list.append(</span><span style="color: #800000;">'</span><span style="color: #800000;"><a href=%s?p=%s class="pg-a alive">下一页</a></span><span style="color: #800000;">'</span> % (base_url,self.current_index + 1<span style="color: #000000;">,))
page_str </span>= mark_safe(<span style="color: #800000;">""</span><span style="color: #000000;">.join(page_list))
</span><span style="color: #0000ff;">return</span> page_str</pre>
}
})
})</span></pre>