day02 web主流框架
day02 web主流框架
今日内容概要
- 手写简易版本web框架
- 借助于wsgiref模块
- 动静态网页
- jinja2模板语法
- 前端、web框架、数据库三种结合
- Python主流web框架
- django框架
手写简易版本web框架
# 类型转换
字符串转bytes类型:res =
s = 'meng 今天'
res = bytes(s,'utf8') # 可以转成二进制类型
bytes类型转字符串:
res1 = str(res,'utf8')
print(res1)
'''
问题1:代码冗余
问题2:处理http数据繁杂
'''
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn, addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf8')
target_url = data.split(' ')[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
if target_url == '/index':
conn.send(b'index')
elif target_url == '/login':
conn.send(b'login')
elif target_url == '/admin':
with open(r'hd.html','rb') as f:
for line in f:
conn.send(line)
else:
conn.send(b'404 error')
wsgiref模块
from wsgiref.simple_server import make_server
def run(request,response):
'''
:param request: 跟请求相关的数据
:param response: 跟响应相关的数据
:return: 返回值就是要给前端浏览器的数据
'''
response('200 OK',[])
# print(request) # 自动帮我们处理了http相关的数据,并组成一个大字典,可以根据key取值。
target_url = request.get('PATH_INFO')
if target_url == '/index':
return [b'index']
elif target_url == '/login':
return [b'login']
elif target_url == '/admin':
return [b'admin']
else:
return [b'404 error']
if __name__ == '__main__':
# 监听127.0.0.1:8000.一旦请求立刻将第三个参数加括号调用
server = make_server('127.0.0.1',8080,run)
# 启动服务端
server.serve_forever()
变形优化代码
针对后缀较多的情况 如何更加优化匹配
def register():
return 'register页面'
urls = [
('/index',index),
('/login',login),
('/reg',register)
]
'''以后新增功能只需要先写一个函数 然后加一组对应关系即可'''
针对同一个py文件内部代码功能繁杂的情况 拆分多个py文件
views.py 专门用于存放核心业务逻辑
urls.py 专门用于存放路径对应关系
templates 专门用于存放html文件
'''以后新增功能只需要views.py写函数 然后urls.py写对应关系即可'''
views.py:存放核心业务逻辑
def index(request):
with open(r'templates/index.html', 'r', encoding='utf8') as f:
return f.read()
def login(request):
return 'login'
def admin(request):
return 'admin'
def error(request):
return '404 error'
urls.py:存放路径对应关系
from views import *
urls = [
('/index', index),
('/login', login),
('/admin', admin),
]
wsgiref.py:存放代码逻辑
from wsgiref.simple_server import make_server
from urls import urls
from views import error
def run(request, response):
response('200 OK', [])
target_url = request.get('PATH_INFO') # 取到'/index'
# 定义一个存储函数名的变量
func = None
for url_tuple in urls: # 相当于取一个个元祖 ('/index',index)
if target_url == url_tuple[0]:
func = url_tuple[1] # 相当于func = index
break
# 判断func是否有对应项
if func:
res = func(request)
else:
res = error(request)
return [res.encode('utf8')]
if __name__ == '__main__':
# 监听127.0.0.1:8000.一旦请求立刻将第三个参数加括号调用
server = make_server('127.0.0.1', 8080, run)
# 启动服务端
server.serve_forever()
动静态网页
动静态网页
动态网页
数据不是直接写死在html页面上的 而是动态获取(后端)
静态网页
数据是直接写死在页面上的
使用我们自己写的web框架 完成一个动态页面的返回
from datetime import datetime
def time(request):
# 获取当前时间
ctime = datetime.now().strftime('%Y-%m-%d %X')
# 读取httl文件
with open(r'templates/time.html', 'r', encoding='utf8') as f:
re_time = f.read()
# 用替换内置方法来达到让html页面显示当前时间
re_time = re_time.replace('当前时间:', '当前时间:%s' % ctime)
return re_time
jinja2模块
该模块提供了"模板语法"
支持后端给html页面传递数据并且支持后端语法
pip3 install jinja2
# views.py
from jinja2 import Template
name = {'username': 'meng', 'age': 18, 'gender': 'male'}
def user(request):
with open(r'templates/user.html', 'r', encoding='utf8') as f:
tom = f.read()
res = Template(tom)
temp = res.render({'user': name})
return temp
# user.html
<body>
<h1>{{user}}</h1>
<h1>{{user['username']}}</h1>
<h1>{{user.get('age')}}</h1>
<h1>{{user.gender}}</h1>
<div>
{% for key in user%}
<p>{{user[key]}}</p>
{%endfor%}
</div>
</body>
python主流web框架
'''千万不要同时学习多个框架!!!'''
django框架
大而全 内部自带的组件特别特别多 类似于航空母舰
有时候可能会过于"笨重"
flask框架
小而精 内部几乎没有什么自带的组件 全部依赖于第三方模块 类似于游骑兵
如果将flask所有的第三方模块集合到一起甚至可以盖过django
有时候可能会出现第三方模块无法兼容的情况
tornado框架
异步非阻塞
"""
同步异步
同步:提交任务之后原地等待任务的返回结果 期间不做任何事
异步:提交任务之后不原地等待任务返回结果 有结果会通过回调机制反馈
阻塞非阻塞
阻塞:程序被剥夺了CPU执行权限
非阻塞:运行态 就绪态
"""
A:socket部分
B:路由匹配
C:模板语法
django
A:不是自己写的 用的wsgiref模块
B:自己写的
C:自己写的
flask
A:不是自己写的 werkzeug(依赖于wsgiref模块)
B:自己写的
C:不是自己写的 jinja2
Tornado
A,B,C全部都是自己写的
知识储备:
fastapi框架
异步框架
django框架
# 1.计算机名称里面最好不要含有中文
# 2.项目名和py文件名尽量也不要使用中文
django版本问题
django1.X
django2.X
django3.X
"""
3.X支持异步(但是目前写的不好)
1.X 2.X 3.X在使用上几乎没有太大差距
针对django版本我们以1.11.11为学习对象
pip3 install django==1.11.11
"""
验证django是否下载完毕,cmd窗口敲下面命令
django-admin
django基本使用
1、命令行创建Django
1.创建django项目
django-admin startproject 项目名
2.如何运行django项目
切到项目目录下
cd 项目名
python3 manage.py runserver
# 可能会报错 需要删除widgets.py 152行逗号
# 路径:D:\Python39\Lib\site-packages\django\contrib\admin\widgets.py
'%s=%s' % (k, v) for k, v in params.items(), # 删除逗号,不然会报错
3.创建app
python3 manage.py startapp app名字
# 命令行中会少一个配置和templates文件夹,需要自己创建和修改
# 修改配置:E:\student\python student\djanpy\djanpy\settings.py中
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], # 添加 os.path.join(BASE_DIR, 'templates') 配置
"""
命令行创建不会自动创建templates文件夹 并且配置文件中也不会配置
需要自己创建文件夹并配置
os.path.join(BASE_DIR, 'templates')
"""
2、pycharm创建Django
find ----->New project---->django
# pycharm不用修改配置
什么是app
django相当于一所大学(空壳子)
app相当于大学里面的各个学院(功能主题)
day02 web主流框架的更多相关文章
- tornado 学习笔记2 Python web主流框架
2.1 Django 官方网址:https://www.djangoproject.com/ 简介:Django is a high-level Python Web framework that e ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Python 四大主流 Web 编程框架
Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- Web前端三大主流框架是什么?Web前端前景与就业形势
近十年以来,IT行业发展火热,衍生了很多新职业,例如UI设计师.开发工程师.软件测试工程师等等,在众多备受瞩目的新生职业中,Web前端工程师是其中的一员.那么Web前端三大主流框架是什么呢? 一.We ...
- Python Web开发主流框架
Web 开发是Python 语言应用领域的重要部分,也是工作岗位最多的领域.如果你对基于Python的Web 开发有兴趣,正打算使用Python 做Web 开发,或者已经是一个Web 开发者有工作需要 ...
- Web自动化框架搭建——前言
1.web测试功能特性 a.功能逻辑测试(功能测试),这一块所有系统都是一致的,比如数据的添加.删除.修改:功能测试案例设计感兴趣和有时间的话可以另外专题探讨: b.浏览器兼容性测试,更重要的是体验这 ...
- Web开源框架大汇总
Struts 项目简介信息 Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的 ...
- 国内5款优秀的WEB前端框架
1. JX(腾讯) 官网地址:http://alloyteam.github.io/JX/#home JX 是一个类似 Google Closure Library 的 Web 前端开发框架,服务于 ...
随机推荐
- 大型DELETE(删除大量数据)的一种解决方案
通过执行单条DELETE语句来删除一个大型的数据集会有以下的缺点: 1.DELETE语句的操作要被完整地记录到日志中,这要求在事务日志中要有足够的空间以完成整个事务: 2.在删除操作期间(可能会花费很 ...
- P1231 教辅的组成(最大流)
P1231 教辅的组成 这个题一看便知是网络流量,(三分图??滑稽..) 就一个小细节,如果我们仅仅将所有的点分成三部分跑网络流的话会有点小问题.. 因为这可能导致一本书被重复利用,就是有两条流经过同 ...
- 01_WPF概述
目录 Windows 图形演化 高级API 分辨率无关性 WPF体系结构 我的微信公众号 Windows 图形演化 在 WPF 之前,windows 开发一直使用本质上相同的显示技术.每个传统 win ...
- pvcreate vgcreate lvcreate 扩容
centos6 服务器磁盘扩容 1.创建物理卷 /dev/sdb #pvcreate /dev/sdb 参数:/dev/sdb 设备名 2.创建卷组 vg_02 #vgcreate vg_02 / ...
- geoserver控制服务访问权限-类似百度地图的key
目录 缘起 可行性分析 如何实现key验证访问 如何控制key能访问哪些地图服务? 如何实现服务器ip白名单 流程梳理 申请key 访问地图 实施步骤 拦截器设置 配置key验证规则 配置服务拦截规则 ...
- 大白话讲解Mybatis的plugin(Interceptor)的使用
mybatis提供了一个入口,可以让你在语句执行过程中的某一点进行拦截调用.官方称之为插件plugin,但是在使用的时候需要实现Interceptor接口,默认情况下,MyBatis 允许使用插件来拦 ...
- [atARC068F]Solitaire
对于最终的序列$a_{i}$,条件如下: 1.$a_{i}$是一个排列,且$a_{k}=1$ 2.不存在三元组$1\le x<y<z<k$,使得$a_{x}<a_{y}< ...
- [spojRNG]Random Number Generator
先将所有数加上Ri,即变为区间[0,2Ri],考虑容斥,将区间容斥为[0,+oo)-[2Ri,+oo),然后对[2Ri,+oo)令$bi=ai-2Ri$,相当于范围都是[0,+oo)问题转化为求n个正 ...
- [cf516E]Drazil and His Happy Friends
令$d=\gcd(n,m)$,存在$x$和$y$使得$xn+i=ym+j$的充要条件是$i\equiv j(mod \ d)$,因此将$xd+i$(其中$0\le i<d$)作为一组,共有$d$ ...
- 六、Java API操作zookeeper节点
目录 前文 pom.xml文件增加依赖 新建java文件:ZookeeperTest GitHub文件下载 前文 一.CentOS7 hadoop3.3.1安装(单机分布式.伪分布式.分布式 二.JA ...