linux cpu占用率如何看
456
2022-09-13
Django框架基础知识汇总(无项目版)
一、WEB框架本质
所有的Web应用,本质上其实是一个socket服务端,用户浏览器是一个socket客户端.
#!/usr/bin/env python#coding:utf-8# 服务端SOCKET import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, Seven") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8000)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
python web程序分为两部分:服务器程序和应用程序。 服务器程序负责对socket服务器进行封装,在请求到来时对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。
WSGI(Web Server Gateway Interface)是一种规范。它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。
from wsgiref.simple_server import make_serverdef RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('
模板引擎生成静态内容:
在上叙中,所有login、index均返回给用户浏览器简单字符串,在现实的Web请求中会返回一个复杂的符合HTML规则的字符串,需将要返回给用户的HTML写在指定文件中,然后再返回,如:
十三、Session
简介:
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
数据库(默认)缓存文件缓存+数据库加密cookie
数据库Session:
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 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只支持 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
使用示例:
def index(request): # 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 获得所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 获得用户session的随机字符串,并非值 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否存在(传入cookies中的key,它对应的value是随机字符串) request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") # 设置session生命周期 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
缓存session:
# 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 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只支持 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
文件Session:
# 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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只支持 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
缓存+数据库Session:
数据库用于做持久化,缓存用于提高效率: a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
加密cookies:
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
扩展:Session用户验证(将验证封装成装饰器)
def login(func): def wrap(request, *args, **kwargs): # 如果未登陆,跳转到指定页面 if request.path == '/test/': return redirect(' return func(request, *args, **kwargs) return
十四、分页
Django内置分页:
# views:from django.shortcuts import renderfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerL = []for i in range(999): L.append(i)def index(request): current_page = request.GET.get('p') paginator = Paginator(L, 10) # 传入数据及每页需要显示的条数 # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) # 返回第1页 except EmptyPage: posts = paginator.page(paginator.num_pages) # 返回最后一页 return render(request, 'index.html', {'posts': posts}) #
# html:
自定义分页:
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入,计算出应该在数据库表中的起始位置。
数据显示部分:1、设定每页显示数据条数2、用户输入页码(第一页、第二页...)3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置4、在数据表中根据起始位置取值,页面上输出数据
页数显示部分:(如:[上一页][1][2][3][4][5][下一页])1、设定每页显示数据条数2、用户输入页码(第一页、第二页...)3、设定显示多少页号4、获取当前数据总条数5、根据设定显示多少页号和数据总条数计算出总页数6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置7、在数据表中根据起始位置取值,页面上输出数据8、输出分页html,如:[上一页][1][2][3][4][5][下一页]
#!/usr/bin/env python# _*_coding:utf-8_*_from django.utils.safestring import mark_safeclass PageInfo(object): def __init__(self,current,totalItem,peritems=5): # current:当前页; totalItem:数据库查出的数据总条数; peritems:每页显示的条数,默认值为5条 self.__current=current self.__peritems=peritems self.__totalItem=totalItem""" 根据当前页码数计算出数据表的查询范围 """# 范围查询范例:models.UserInfo.objects.all()[page_info.start():page_info.end()] def From(self): # 根据当前页获得从数据库中进行范围查询时的起始序号 return (self.__current-1)*self.__peritems def To(self): return self.__current*self.__peritems # 根据当前页获得从数据库中进行范围查询时的结束序号 def TotalPage(self): # 计算显示页码部分的总页数 result=divmod(self.__totalItem,self.__peritems) #返回一个包含商和余数的元组,商为总页数 if result[1]==0: # 表示可以整除 return result[0] else: return result[0]+1 # 数据库总数/页面总数后还有多余的数据,所以总条数还需要加1页来显示剩余的数据""" 根据基础页链接,当前页,总页数计算出页码显示部分的内容 """def Custompager(baseurl,currentPage,totalpage): #基础页,当前页,总页数perPager=11 # 默认页码数显示范围为11# if 总页数<11#0 -- totalpage # 获得从起始页到总页数的范围,end页码数就是根据数据库总页数# if 总页数>11# if 当前页>5 获得 currentPage-5 -- currentPage+5的页码数#currentPage+5是否超过总页数,超过总页数,end就是总页数# if 当前页< 5 获得 0 -- 11 范围的页码数# 根据begin,end的范围显示所有的中间页码数begin=0end=0if totalpage <= 11:begin=0end=totalpageelse:if currentPage>5:begin=currentPage-5end=currentPage+5if end > totalpage:end=totalpageelse:begin=0end=11# 组装页码数显示模块pager_list=[]if currentPage<=1:first="首页"else:first="首页" % (baseurl,1)pager_list.append(first)if currentPage<=1:prev="上一页"else:prev="上一页" % (baseurl,currentPage-1)pager_list.append(prev)# 循环中间页,与数据表中的数据显示关联起来for i in range(begin+1,end+1):if i == currentPage: # 当前页选中状态,添加class样式temp="%d" % (baseurl,i,i)else:temp="%d" % (baseurl,i,i)pager_list.append(temp)#if currentPage>=totalpage:next="下一页"else:next="下一页" % (baseurl,currentPage+1)pager_list.append(next)# if currentPage>=totalpage:last="末页"else:last="末页" % (baseurl,totalpage)pager_list.append(last)result=''.join(pager_list) # 将列表数据通过拼接转换成字符串return mark_safe(result) #把字符串转成html语言
总结,分页时需要做三件事:创建处理分页数据的类根据分页数据获取数据输出分页HTML,即:[上一页][1][2][3][4][5][下一页]
十五、序列化
Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。
serializers模块:对Queryset对象序列化
from django.core import serializers ret = models.BookType.objects.all() data = serializers.serialize("json", ret)
json.dumps:
import json #ret = models.BookType.objects.all().values('caption') ret = models.BookType.objects.all().values_list('caption') ret=list(ret) # 将元组列表对象转换为列表对象 result = json.dumps(ret) # 将列表对象序列化为json字符串
json.dumps时无法处理datetime日期,可通过自定义处理器来做扩展
import json from datetime import date from datetime import datetime class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): # 传入数据类型判断,时间 return o.strftime('%Y-%m-%d %H:%M:%S') # 格式化成字符串 elif isinstance(field, date): # 日期 return o.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field) # 调用父类中的default方法 # ds = json.dumps(d, cls=JsonCustomEncoder) # 扩展类的应用范例,d为日期数据
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~