一、http请求周期
浏览器(socket客户端):2.socket.connect(ip,端口)3.socket.send("规则: http协议GET请求:"GET  /index.html?k1=1&k2=2  Http/1.1\r\nhost:www.xiaohuar.com\r\ncontent-type: application/json\r\n\r\n"请求头和请求体使用\r\n\r\n分割, 前面是请求头,后面是请求提POST请求:"POST  /index.html?k1=1&k2=2  Http/1.1\r\nhost:www.xiaohuar.com\r\ncontent-type: application/json\r\n\r\nusername=alex&pwd=123"请求头和请求体使用\r\n\r\n分割,前面是请求头,后面是请求体6.获取响应响应头,响应体 = data.split('\r\n\r\n')7.断开连接web端:1.服务端运行: ip,端口4.字符串 = server.recv()头,体 = data.split("\r\n\r\n")5.服务端响应.conn.send('......')响应头:响应体:7.断开连接总结:a.Http请求中本质都是字符串b.Http请求短链接(请求,响应断开连接)c.请求和响应都有: 头、体请求:请求头\r\n\r\n请求体响应:响应头\r\n\r\n响应体<html>....</html>二、django框架Django本质:socket(wsgiref)解析和封装http请求(*)视图函数:def index(request):request.GETrequest.body #获取原生的请求体request.POST #如果请求头中: content-type: urlencode-form...才将request.body转化成字典可能有值,可能没值request.methodrequest.Metarequest.GET.get()request.GET.getlist()request.POST.get()request.POST.getlist()return HttpResponse('字符串/字节')return render(request,"html路径", {})return redirect('URL')
三、cookie和sessioncookie是客户端浏览器请求服务端登录时,服务端生成的一段键值对携带在响应头中,下
次客户端请求时,服务端会先验证cookie是否存在,存在则不需要重新登录,否则要从新登录session是客户端登录服务端时,验证通过后会随机生成一段字符串作为key存放在django.session表中,
值是也是一个字典,是程序设定的一些用户信息,同时响应头会携带这个key返回给客户端,这样会更加
安全。session认证登录退出流程:
def auth(func):def inner(request,*args,**kwargs):ck = request.session.get('uuuuuuuu')if not ck:return redirect('/login.html')return func(request, *args, **kwargs)return inner@auth
def index(request):user = request.session.get('uuuuuuuu')return render(request,'index.html',{'user': user})def login(request):if request.method == "GET":return render(request,'login.html')else:user = request.POST.get('user')pwd = request.POST.get('pwd')pwd = encrypt(pwd)obj = models.userInfo.objects.filter(username=user,password=pwd).first()if obj:request.session['uuuuuuuu'] = user #存放在django.session中这个用户key对应的字典值中request.session.set_expiry(5)return redirect('/index.html')else:return render(request,'login.html',{'msg':'用户名或密码错误'})
def logout(request):request.session.clear()return redirect('/login.html')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只支持http传输(默认)
# SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默认)
# SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
# SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存(默认)
四、csrf_token跨站请求伪造,post提交数据为避免其他网站通过用户session信息获取信息,需要使用{% csrf_token %},在ajax提交时,可以使用以下方式:$.ajax({url:"/icbc.html",type:"POST",data: {'k1':'v1','k2':'v2','csrfmiddlewaretoken':"{{ csrf_token }}"},success:function(arg){console.log(arg)}})五、分页urls.py
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'hosts.html$', views.hosts),
]views.py
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
# Create your views here.
from utils.pagination import Pagedef hosts(request):current_page = int(request.GET.get('page'))all_count = models.Host.objects.all().count()page_obj = Page(current_page,all_count,request.path_info)host_list = models.Host.objects.all()[page_obj.start:page_obj.end]page_str = page_obj.page_html()return render(request,'hosts.html',{'host_list':host_list,'page_str':page_str})models.py    #数据库自己填充足够数据测试
from django.db import models# Create your models here.
class Host(models.Model):hostname = models.CharField(max_length=32)port = models.CharField(max_length=10)分页模块
pagination.py
class Page:def __init__(self,current_page, all_count, base_url,per_page=10, pager_page_count=11):""":param current_page: 当前页码:param all_count: 总数据条数:param base_url::param per_page: 每页显示数据条数:param pager_page_count: 页面显示页码数"""self.base_url = base_urlself.current_page = current_pageself.per_page = per_pageself.pager_page_count = pager_page_countpager_count, b = divmod(all_count,per_page) #pager_count总页码数if b != 0:pager_count += 1self.pager_count = pager_counthalf_pager_page_count = int(pager_page_count / 2)self.half_pager_page_count = half_pager_page_count@propertydef start(self):"""数据获取值起始索引:return:"""return (self.current_page - 1) * self.per_page@propertydef end(self):"""数据获取值结束索引:return:"""return self.current_page * self.per_pagedef page_html(self):"""生成html页面"""#如果数据总页码pager_count<11 pager_page_countif self.pager_count < self.pager_page_count:pager_start = 1pager_end = self.pager_countelse:# 数据页码已经超过11# 判断: 如果当前页 <=5 half_pager_page_countif self.current_page <= self.half_pager_page_count:pager_start = 1pager_end = self.pager_page_countelse:# 如果: 当前页码+5 > 总页码if (self.current_page + self.half_pager_page_count) > self.pager_count:pager_end = self.pager_countpager_start = self.pager_count - self.pager_page_count + 1else:pager_start = self.current_page - self.half_pager_page_countpager_end = self.current_page + self.half_pager_page_countpage_list = []if self.current_page <= 1:prev = '<a href="#">上一页</a>'else:prev = '<a href="%s?page=%s">上一页</a>' % (self.base_url,self.current_page-1,)page_list.append(prev)for i in range(pager_start, pager_end + 1):if self.current_page == i:tpl = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url, i, i,)else:tpl = '<a href="%s?page=%s">%s</a>' % (self.base_url,i,i,)page_list.append(tpl)if self.current_page >= self.pager_count:nex = '<a href="#">下一页</a>'else:nex = '<a href="%s?page=%s">下一页</a>' % (self.base_url,self.current_page+1,)page_list.append(nex)page_str = "".join(page_list)return page_str测试页面hosts.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.pagination1 a{display: inline-block;padding: 5px 8px;background-color: darkslateblue;margin: 5px;color: white;}.pagination1 a.active{background-color: green;}</style>
</head>
<body><h1>主机列表</h1><table border="1"><thread><tr><th>ID</th><th>主机名</th><th>端口</th></tr></thread><tbody>{% for row in host_list %}<tr><td>{{ row.id }}</td><td>{{ row.hostname }}</td><td>{{ row.port }}</td></tr>{% endfor %}</tbody></table><div class="pagination1">{{ page_str|safe }}</div>
</body>
</html>

转载于:https://blog.51cto.com/haoyonghui/1962423

django session, 分页,数据库学习相关推荐

  1. python建立文件数据库_python学习-- Django根据现有数据库,自动生成models模型文件...

    Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...

  2. 数据库学习记录806

    1. (1)基本概念 ① 属性和域: 每个事物有很多属性,每个属性对应的取值范围叫做域,所有对域都是原子数据(第一范式) ② 相关名词 n元关系:R(D1,D2,D3...Dn)是n元关系,其中关系属 ...

  3. Django 入门(个人学习笔记,持续更新)

    导语:这些笔记都是结合自己的学习和查找网上的资料笔记或者回答上整理,可能有很多内容类似,目的是为了让自己以后忘了知识点可以看自己写的笔记,第一次写技术笔记,多多包涵. MVC 大部分开发语言中都有MV ...

  4. Django项目搭建【学习笔记】

    Django项目搭建[学习笔记] 创建工程 安装 pip install django==1.11.11 -i https://pypi.tuna.tsinghua.edu.cn/simple 创建D ...

  5. Django 笔记5 -- 数据库

    Django 笔记5 – 数据库 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django ...

  6. php session写入数据库_php session 写入数据库,phpsession

    php session 写入数据库,phpsession 本文实例介绍了php session 写入数据库的方法,分享给大家供大家参考,具体内容如下 config = $args; $this-> ...

  7. Django—自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...

  8. Flask数据库学习

    数据库学习 @(Flask) 关系型数据库(SQL数据库) 文档数据库和键值对数据库 (NoSQL) SQL数据库 表是关键.用表可以模拟程序中不同的实体. 主键:各行的唯一标识符. 外键:引用同一个 ...

  9. Python3.7中,Django配置MySql数据库

    上一节中讲了Python3.7搭建Django框架项目 ,并且项目能够运行起来,Django框架中默认配置的数据库是sqlite,sqlite数据库虽然小巧,但是对于大型项目时sqlite就会有瓶颈, ...

最新文章

  1. RabbitMQ学习总结 第一篇:理论篇
  2. The source attachment does not contain the source for the file Activity.class
  3. 使用递归的方式实现简易的二分法
  4. Treasure Exploration
  5. java ee7帮助文档_帮助推动Java EE向前发展
  6. 秒级启动万个容器,探秘阿里云容器镜像加速黑科技
  7. php软件开发--mongodb
  8. jmeter笔记02
  9. 判断两根线段是否相交
  10. python多进程编程实例_Python多进程并发(multiprocessing)用法实例详解
  11. 软件质量保证与测试 问答题
  12. 工业路由器和家用路由器有什么区别?
  13. vm虚拟机怎么连接wifi_win7下安装的vmware虚拟机怎么接入无线局域网实现网络互联互通-网络教程与技术 -亦是美网络...
  14. 5-2本题要求对两个整数a和b,输出其中较大的数。
  15. 帝国源码php安装文件是哪个,帝国CMS数据库配置文件是哪个
  16. Java对马踏棋盘问题(骑士周游问题)的实现
  17. 基于最小均值 (LMF) 和最小均方 (LMS) 算法进行系统识别附matlab代码
  18. 【OC】JSONModel基本使用
  19. VM2230 asdebug.js:xxx:端口不在以下 request 合法域名列表中
  20. 第5章 网站前台-活动与招聘

热门文章

  1. 如何用ASP.NET加密Cookie数据过程分析
  2. [C#1] 10-事件
  3. 单链表中如何快速删除p指向的节点?( 简单方法:复杂度为O(1) )
  4. C/C++输入输出函数(I/O)总结
  5. pyinstaller打包后读不到配置文件的解决方法
  6. 2018视频人物识别挑战赛冠军经验分享:在现有机器资源条件下更快速验证是关键...
  7. javascript的promise
  8. keepalived中的脑裂
  9. C语言树形打印二叉树
  10. Oracle EBS常用数据表