⑴ python用于数据分析和web开发的不同
Python语言成为数据科学领域的流行语言不只仅仅因为大数据公司采用它,还因为很多该领域的起步教学也是使用它,Python语言已经在2015机器学习领域上升到前十大语言。
Bjarne Stroustrup说:有两种语言:一种人们抱怨它,另外一种却没有人使用。
Python语言属于前一种,却在数值计算 机器学习等领域使用量不断上升,Python除了性能攸关的领域以外几乎能做任何事情,使用Python最好的选择是进行数据分析和统计计算,而学习Python用于Web开发却需要掌握很多不同的Web框架,比如Django,而学习Python用于数据科学只需要数据科学家们学习正则表达式的使用,包括科学类库和数据虚拟化等概念即可。这是两种完全不同的目标,无需掌握任何Web编程概念的数据专家可以容易地使用Python进行数据工作,毫无任何困难。
Python是一个有23年历史的丰富表达的动态编程语言,编程人员可以一次编写代码无需另外编译器就能执行,在Web开发中Python支持各种编程范式比如结构编程,函数式编程和面向对象编程。
不可否认使用Python编写一个动态Web网站可以是很优秀的,但是学习Web框架也是必须的。
下面是几种PythonWeb开发框架:
1. Django:它是一个完美的快速Web开发框架,适合数据库驱动的Web应用开发,但是它也许有点overkill(过度的杀伤威力),因为它会混淆文件系统和严格目录结构(strict directory structure),使用python进行Web开发的公司有纽约时报 Instagram,和 Pinterest.
2.Flask:这是对于初学者轻量解决方案,适合开发单页Web应用,框架不支持检验 数据抽象层和其他框架有的组件功能,它不是完整开发栈,只是用于小网站。
3.CherryPy:它着重Python的惯例设计,这样可以使用面向对象的方式开发应用,它是其他完整开发栈框架(TurboBears 和 Web2py)的基础模板。
此外还有Pyramid, Bottle, 和Pylons 等待,无论使用哪个框架,都需要深度阅读理解文档和教程。
使用Python进行Web开发也许是一个不切实际的选择,理由如下:
1.使用Python进行Web开发需要非标准和昂贵的主机托管,而PHP语言如此广泛应用在web开发,因此,大部分投资者不会投资用于运行python web网站的主机资源。也就是说,很难找到像PHP那样的主机资源运行你的Python Web应用。
2.相比PHP Java和Ruby on Rails,Python并不是在Web开发领域的普遍开发技术,Python用于数据科学正在不断吸引注意力,大量从事数据科学和机器学习的公司在寻找这方面的Python人才,而不是Web方面的Python人才。
3.Python用于Web开发已经探索很长一段时间,但是它相比其他语言如PHP,在学习方面有比较陡峭的学习曲线,比较难以学习掌握。
为什么Python是最适合于数据科学呢?
Python因为其类似英语语法,在研发大数据 财务 统计和数值计算等方面有其强大的天然性,最近快速增长的机器学习,自然语言处理和数据虚拟化以及数据探测 数据分析以及数据挖掘等需求导致了形成Pythonification。Python是数据科学家最畅销的技能,在纽约进行Python数据科学编程平均薪水是 $140,000
那么为什么数据科学家喜欢使用Python进行数据科学研究呢?
因为Python能够让他们的想法更快速地原型化,他们喜欢赶快把想法实现,然后快速地从巨大的数据集中分析得出结论。而Python在这方面编程是最多才多艺、最体现其能力的全才,它有助于科学家以优化最短的时间编码、调试、执行和得到的结果。
一个伟大的企业数据科学家真正价值是使用各种数据可视化帮助根据数据模式进行快速预测,从而赢得商业竞争优势,否则只是一场零和游戏。Python有科学计算需要的很高的计算强度。
1.Python有统一的设计哲学,它聚焦于易于使用,可读性好和对数据科学家的易学低门槛。
2.Python有高可扩展性scalability,和Stata, Matlab相比要快得多。
3.有越来越多的数据虚拟包和很酷的应用编程接口都增加了图形接口来采纳数据分析的结果输出。
4.Python有很大的数据科学社区,包括Sci-Kit learn, NumPy, Pandas, 和Statsmodels, SciPy等库包,这些都已经充分测试,Python数据科学包一直在增长。
⑵ 初学者怎么学习Python
初学者、零基础学Python的话,建议参加培训班,入门快、效率高、周期短、实战项目丰富,还可以提升就业竞争力。
以下是老男孩教育Python全栈课程内容:阶段一:Python开发基础
Python开发基础课程内容包括:计算机硬件、操作系统原理、安装linux操作系统、linux操作系统维护常用命令、Python语言介绍、环境安装、基本语法、基本数据类型、二进制运算、流程控制、字符编码、文件处理、数据类型、用户认证、三级菜单程序、购物车程序开发、函数、内置方法、递归、迭代器、装饰器、内置方法、员工信息表开发、模块的跨目录导入、常用标准库学习,b加密\re正则\logging日志模块等,软件开发规范学习,计算器程序、ATM程序开发等。
阶段二:Python高级级编编程&数据库开发
Python高级级编编程&数据库开发课程内容包括:面向对象介绍、特性、成员变量、方法、封装、继承、多态、类的生成原理、MetaClass、__new__的作用、抽象类、静态方法、类方法、属性方法、如何在程序中使用面向对象思想写程序、选课程序开发、TCP/IP协议介绍、Socket网络套接字模块学习、简单远程命令执行客户端开发、C\S架构FTP服务器开发、线程、进程、队列、IO多路模型、数据库类型、特性介绍,表字段类型、表结构构建语句、常用增删改查语句、索引、存储过程、视图、触发器、事务、分组、聚合、分页、连接池、基于数据库的学员管理系统开发等。
阶段三:前端开发
前端开发课程内容包括:HTML\CSS\JS学习、DOM操作、JSONP、原生Ajax异步加载、购物商城开发、Jquery、动画效果、事件、定时期、轮播图、跑马灯、HTML5\CSS3语法学习、bootstrap、抽屉新热榜开发、流行前端框架介绍、Vue架构剖析、mvvm开发思想、Vue数据绑定与计算属性、条件渲染类与样式绑定、表单控件绑定、事件绑定webpack使用、vue-router使用、vuex单向数据流与应用结构、vuex actions与mutations热重载、vue单页面项目实战开发等。
阶段四:WEB框架开发
WEB框架开发课程内容包括:Web框架原理剖析、Web请求生命周期、自行开发简单的Web框架、MTV\MVC框架介绍、Django框架使用、路由系统、模板引擎、FBV\CBV视图、Models ORM、FORM、表单验证、Django session & cookie、CSRF验证、XSS、中间件、分页、自定义tags、Django Admin、cache系统、信号、message、自定义用户认证、Memcached、redis缓存学习、RabbitMQ队列学习、Celery分布式任务队列学习、Flask框架、Tornado框架、Restful API、BBS+Blog实战项目开发等。
阶段五:爬虫开发
爬虫开发课程内容包括:Requests模块、BeautifulSoup,Selenium模块、PhantomJS模块学习、基于requests实现登陆:抽屉、github、知乎、博客园、爬取拉钩职位信息、开发Web版微信、高性能IO性能相关模块:asyncio、aiohttp、grequests、Twisted、自定义开发一个异步非阻塞模块、验证码图像识别、Scrapy框架以及源码剖析、框架组件介绍(engine、spider、downloader、scheler、pipeline)、分布式爬虫实战等。
阶段六:全栈项目实战
全栈项目实战课程内容包括:互联网企业专业开发流程讲解、git、github协作开发工具讲解、任务管理系统讲解、接口单元测试、敏捷开发与持续集成介绍、django + uwsgi + nginx生产环境部署学习、接口文档编写示例、互联网企业大型项目架构图深度讲解、CRM客户关系管理系统开发等。
阶段七:数据分析
数据分析课程内容包括:金融、股票知识入门股票基本概念、常见投资工具介绍、市基本交易规则、A股构成等,K线、平均线、KDJ、MACD等各项技术指标分析,股市操作模拟盘演示量化策略的开发流程,金融量化与Python,numpy、pandas、matplotlib模块常用功能学习在线量化投资平台:优矿、聚宽、米筐等介绍和使用、常见量化策略学习,如双均线策略、因子选股策略、因子选股策略、小市值策略、海龟交易法则、均值回归、策略、动量策略、反转策略、羊驼交易法则、PEG策略等、开发一个简单的量化策略平台,实现选股、择时、仓位管理、止盈止损、回测结果展示等功能。
阶段八:人工智能
人工智能课程内容包括:机器学习要素、常见流派、自然语言识别、分析原理词向量模型word2vec、剖析分类、聚类、决策树、随机森林、回归以及神经网络、测试集以及评价标准Python机器学习常用库scikit-learn、数据预处理、Tensorflow学习、基于Tensorflow的CNN与RNN模型、Caffe两种常用数据源制作、OpenCV库详解、人脸识别技术、车牌自动提取和遮蔽、无人机开发、Keras深度学习、贝叶斯模型、无人驾驶模拟器使用和开发、特斯拉远程控制API和自动化驾驶开发等。
阶段九:自动化运维&开发
自动化运维&开发课程内容包括:设计符合企业实际需求的CMDB资产管理系统,如安全API接口开发与使用,开发支持windows和linux平台的客户端,对其它系统开放灵活的api设计与开发IT资产的上线、下线、变更流程等业务流程。IT审计+主机管理系统开发,真实企业系统的用户行为、管理权限、批量文件操作、用户登录报表等。分布式主机监控系统开发,监控多个服务,多种设备,报警机制,基于http+restful架构开发,实现水平扩展,可轻松实现分布式监控等功能。
阶段十:高并发语言GO开发高并发语言GO开发课程内容包括:Golang的发展介绍、开发环境搭建、golang和其他语言对比、字符串详解、条件判断、循环、使用数组和map数据类型、go程序编译和Makefile、gofmt工具、godoc文档生成工具详解、斐波那契数列、数据和切片、make&new、字符串、go程序调试、slice&map、map排序、常用标准库使用、文件增删改查操作、函数和面向对象详解、并发、并行与goroute、channel详解goroute同步、channel、超时与定时器reover捕获异常、Go高并发模型、Lazy生成器、并发数控制、高并发web服务器的开发等。
⑶ Python三大web框架分别是什么 哪个更好
【导读】目前,Python比较火的三大web框架有Django、Flask和Tornado,要论这三个Web框架哪个更好的话,建议一点,Django帮我们事先搭建了好多,上手会快一些,学习的话可以先从Django学起,然后再学习Flask和Tornado,下面我们就来具体了解一下Python三大web框架的详情。
1、Django
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
2、Flask
Flask是一个使用Python编写的轻量级Web应用框架。其 WSGI工具箱采用Werkzeug ,模板引擎则使用 Jinja2
。Flask使用BSD授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension
增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm +
Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。
3、Tornado
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python
的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个
理想框架。
关于Python三大web框架的简单介绍,就给大家分享到这里了,当然学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚,希望大家抓紧时间进行学习吧。
⑷ Python3 使用Web3.py查询以太坊账户余额
from web3 import Web3
def QuerryBalanceETH(accounts):
w3 = Web3(Web3.HTTPProvider('https://mainnet. infura .io/v3/ {此处设置自己托管账户ID} '))
#accounts = w3.eth.accounts
balance = w3.eth.getBalance(accounts,'latest')#latest表示使用区块链中最后一个块的状态,也就是最后的余额
print('balance@latest => {0}'.format(balance))
return balance
1、什么是Infura?
专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。
通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。
从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。
除此之外,Infura还可以很方便地接入IPFS,这是另外一个话题,这里就不讨论了。
最后,也是非常重要的一点:Infura目前是免费的。
2、如何使用Infura?
使用Infura首先需要注册一个账户,访问官网 https://infura.io ,点击注册并提供一个邮箱,会收到一封邮件,点击邮件中的链接激活就可以了,然后你就会看到下面的界面:
点击右上角的黑色按钮,创建新项目,就可以生成你专属的Project ID了(左边的红框)。
参考文章: https://blog.csdn.net/TurkeyCock/article/details/85103434
⑸ 学Python做web还是爬虫未来那个发展比较好
光会一种待遇不好,要定位全栈。
⑹ python做web开发好吗
Python适合从简单到复杂的各种Web项目。它广泛用于旅行,医疗保健,交通运输,金融等不同领域,用于Web开发和软件测试,脚本编写和生成。
选择Python进行Web开发的优点:
1、易于使用和阅读
有几个因素可以简化Python在Web开发中的使用:
低入门门槛 Python与我们日常生活中使用的英语相似。语法的简单性使您可以处理复杂的系统,并确保所有元素之间都具有明确的关系。因此,更多的新手程序员可以学习该语言并更快地加入编程社区。
良好的可视化 效果通过使用不同的图和图表,可以以易于理解的格式表示数据。它们是可视化呈现和理解数据的有效方法。Web开发公司利用Python库(例如Matplotlib)来可视化数据并创建清晰且易于理解的报告。
Python非常易于阅读,因此开发人员通常在理解由其他程序员编写的代码时不会遇到任何问题。这可以促使从事同一项目的开发人员之间的通信效率更高。
2、异步编码
由于没有死锁或研究争执或任何其他令人困惑的问题,因此使用Python 编写和维护异步代码无需花费太多精力。此类代码的每个单元分别运行,从而使您能够更快地处理各种情况和问题。
3、较少限制的编程方法
与其他编码语言(例如Java)相比,Python具有较少限制的编程方法。它具有多种范例,可以支持多种编程风格,包括过程性,面向对象和功能性(命令性)。这使Python成为初创公司的绝佳语言,因为项目可能需要随时更改方法。
4、企业应用集成
Python是企业软件应用程序的流行选择,这在很大程度上要归功于Python与传统上用于企业开发的其他语言(例如Java,PHP和.NET)的流畅集成。
Python直接与Java,C ++或C代码进行调用,从而可以对大多数常用协议和数据格式进行大量的过程控制和实现。
除此之外,它还可以用于组装基础结构的新旧片段,这是复杂移动应用程序中的典型情况。
5、可以使用Python框架快速进行Web开发
Python的另一个优点是它具有许多简化开发过程的框架。根据您的工作,可能需要不同的框架。
6、科学计算库方便
有各种各样的软件包和库可用于开发科学和数字应用程序,以及工具包(例如VTK 3D和MayaVi),单独的成像库以及许多其他工具。
7、用于机器学习和AI
机器学习(ML)和人工智能(AI)技术越来越受到关注,因此越来越多的开发人员正在尝试将它们纳入各种项目中。如果使用正确的语言,这是可能的。
根据让·弗朗索瓦·普吉,IBM的机器学习部门的代表,Python是ML和AI项目的顶尖语言,许多开发商同意。Python具有高效的ML软件包,用于可视化结果的工具,并且远远超出了数据分析和其他使该应用程序领域受益的功能。
Python确实是机器学习和人工智能最火热的语言,没有之一。
最典型的用语在线语音合成,在线语音识别,如果你的项目是建立一个人工智能的web应用,那么Python再适合不过了。
8、作为应用程序脚本
由于Python与C,C ++和Java的强大集成,Python可以很方便地用于应用程序脚本编写。从一开始就被设计为可嵌入的,它对于自定义大型应用程序并为其进行扩展非常有用。
不敢说Python可以代替Lua,不过Python可以和Lua那样被嵌入C/C++中。
9、软件测试
Python用于测试自动化。许多QA自动化专家选择Python是因为它具有简单的学习曲线-对于技术背景较为有限的人(强大的社区,清晰的语法和可读性)也非常有用。Python甚至有一个易于使用的单元测试框架(例如,您可以使用它对移动应用程序执行地理位置测试)。
M年前我在一家路由生产商上班,那时候我看到测试部门用Tcl脚本去测试路由器端口,我当时就觉得很诧异,毕竟Tcl脚本的语法真的很怪异,相比这点,Python的语法真的干净简洁。
10、在原型制作中使用
用Python创建原型已被证明是一个快速而简单的过程。编程语言的敏捷性使代码重构变得容易,并且可以将初始原型快速开发为最终产品。
11、开源
Python具有开放源代码许可证,该许可证使用户可以轻松访问它,并有助于重新分发和无限制的修改。开发人员可以自由使用该语言并为它的改进做出贡献。
12、服务器端脚本
如上所述,使用Python进行服务器端脚本编写的优点之一是其简单的语法,从而大大加快了处理速度。该代码由功能模块及其之间的连接组成,可让您根据用户操作执行程序算法。Python还支持Web开发中所需的图形用户界面。
13、便携性和交互性
Python具有动态语义和快速原型制作的出色功能,这要归功于它的交互性和可移植性。它可以轻松地嵌入各种应用程序中,甚至是使用不同编码语言的应用程序。因此,您可以轻松修复新模块并扩展Python的核心词汇。它可以连接各种组件。难怪它有时被称为“胶水语言”。
推荐学习:《Python教程》
⑺ Python小例-8-记账小程序
import pickle
import time
import os
def cost(fname):
'用于记录花费'
cost_time = time.strftime('%Y-%m-%d')
try:#异常处理机制
cost_deposit = int(input('花销金额:'))
cost_mark = input('花销说明:')
except ValueError:
print('无效的金额')
return # 函数的return类似于循环的break,return提前结束函数。
except (KeyboardInterrupt, EOFError):
print('\nbye-bye')
exit(1)
# 在文件中取出所有的收支记录
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
# 计算最新余额
balance = records[-1][-2] - cost_deposit
# 构建最新一笔收入
record = [cost_time,0,cost_deposit,balance,cost_mark]
# 将收入追加到收支列表中
records.append(record)
# 将最新收支情况写入文件
with open(fname,'wb') as fobj:
pickle.mp(records,fobj)
def save(fname):
save_time = time.strftime('%Y-%m-%d')
try:
save_deposit = int(input('收入金额:'))
save_mark = input('收入说明:')
except ValueError:
print('无效的金额')
return
except (KeyboardInterrupt,EOFError):
print('bye-bye')
exit(1)
with open(fname, 'rb') as fobj:
records = pickle.load(fobj)
balance = records[-1][-2] + save_deposit
record = [save_time,save_deposit,0,balance, save_mark]
records.append(record)
with open(fname, 'wb') as fobj:
pickle.mp(records, fobj)
def query(fname):
'用于查账'
# 打印表头
print(f'{"date":<15}{"save":<8}{"cost":<8}{"balance":<12}{"mark":<50}')
with open(fname,'rb') as fobj:
records = pickle.load(fobj)
for date,cost,save,balance,mark in records:
print(f'{date:<15}{cost:<8}{save:<8}{balance:<12}{mark:<50}')
def menu():
funcs = {'0':cost,'1':save,'2':query}
prompt = '''(0)开销
(1)收入
(2)查询
(3)退出
请选择(0/1/2/3):'''
fname = 'account.data'
if not os.path.exists(fname):
init_data = [[time.strftime('%Y-%m-%d'),0,0,10000,'init_data']]
with open(fname,'wb') as fobj:
pickle.mp(init_data,fobj)
while 1:
try:
choice = input(prompt).strip()
except(KeyboardInterrupt,EOFError):
choice = '3'
if choice not in ['0','1','2','3']:
print('无效输入,重试')
continue
if choice == '3':
print('\nbye_bye')
break
funcs[choice](fname)
if __name__ == '__main__':
menu()
⑻ python怎么做web开发
用Python做Web开发,Django框架是个非常好的起点。
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用
于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。
Django已经成为web开发者的首选框架,是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别
代表模型、视图、控制器。Django其实也是一个MTV 的设计模式。MTV是Model、Template、View三个单词的简写,分别代表模型、
模版、视图 。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板
(Template)和视图(Views),称为 MTV模式。
Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说,
Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得
Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
至于MVC控制器部分,由Django框架的URLconf来实现。URLconf机制是使用正则表达式匹配URL,然后调用合适的Python函数。
URLconf对于URL的规则没有任何限制,你完全可以设计成任意的URL风格,不管是传统的,RESTful的,或者是另类的。框架把控制层
给封装了,无非与数据交互这层都是数据库表的读,写,删除,更新的操作。在写程序的时候,只要调用相应的方法就行了,感觉很方便。程
序员把控制层东西交给Django自动完成了。 只需要编写非常少的代码完成很多的事情。所以,它比MVC框架考虑的问题要深一步,因为
我们程序员大都在写控制层的程序。这个工作交给了框架,仅需写很少的调用代码,大大提高了工作效率。
更多技术请关注Python视频教程。
⑼ 纯 Python 写一个 Web 框架,就是这么简单
造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子,我称它为 ToyWebF 。
本文操作环境为:MacOS,文中涉及的命令,请根据自己的系统进行替换。
ToyWebF的简单特性:
下面我们来实现这些特性。
首先,我们需要安装gunicorn,回忆一下Flask框架,该框架有内置的Web服务器,但不稳定,所以上线时通常会替换成uWSGI或gunicorn,这里不搞这个内置Web服务,直接使用gunicorn。
我们创建新的目录与Python虚拟环境,在该虚拟环境中安装gunicorn
在啥都没有的情况下,构建最简单的Web服务,在ToyWebF目录下,创建app.py与api.py文件,写入下面代码。
运行 gunicorn app:app 访问 http://127.0.0.1:8000 ,可以看见 Hello, World! ,但现在请求体中的参数在environ变量中,难以解析,我们返回的response也是bytes形式。
我们可以使用webob库,将environ中的数据转为Request对象,将需要返回的数据转为Response对象,处理起来更加直观方便,直接通过pip安装一下。
然后修改一下API类的 __call__方法 ,代码如下。
上述代码中,通过webob库的Request类将environ对象(请求的环境信息)转为容易处理的request,随后调用handle_request方法对request进行处理,处理的结果,通过response对象返回。
handle_request方法在ToyWebF中非常重要,它会匹配出某个路由对应的处理方法,然后调用该方法处理请求并将处理的结果返回,在解析handle_request前,需要先讨论路由注册实现,代码如下。
其实就是将路由和方法存到self.routes字典中,可以通过route装饰器的形式将路由和方法关联,也可以通过add_route方法关联,在app.py中使用一下。
因为url中可以存在变量,如 @app.route("/hello/{name}") ,所以在匹配时,需要进行解析,可以使用正则匹配的方式进行匹配,parse这个第三方库已经帮我们实现了相应的正则匹配逻辑,pip安装使用一下则可。
这里定义find_handler方法来实现对self.routes的遍历。
了解了路由与方法关联的原理后,就可以实现handle_request方法,该方法主要的路径就是根据路由调度对应的方法,代码如下。
在该方法中,首先实例化webob库的Response对象,然后通过self.find_handler方法获取此次请求路由对应的方法和对应的参数,比如。
它将返回hello方法对象和name参数,如果是 /hello/二两 ,那么name就是二两。
因为route装饰器可能装饰器的类对象,比如。
此时self.find_handler方法返回的hanler就是个类,但我们希望调用的是类中的get、post、delete等方法,所以需要一个简单的判断逻辑,通过inspect.isclass方法判断handler如果是类对象,那么就通过getattr方法获取类对象实例的中对应的请求方法。
如果类对象中没有该方法属性,则抛出该请求类型不被允许的错误,如果不是类对象或类对象中存在该方法属性,则直接调用则可。
此外,如果方法的路由并没有注册到self.routes中,即404的情况,定义了defalut_response方法返回其中内容,代码如下。
如果handle_request方法中调度的过程出现问题,则直接raise将错误抛出。
至此,一个最简单的web服务就编写完成了。
回顾Flask,Flask可以支持HTML、CSS、JavaScript等静态文件,利用模板语言,可以构建出简单但美观的Web应用,我们让TopWebF也支持这一功能,最终实现图中的网站,完美兼容静态文件。
Flask使用了jinja2作为其html模板引擎,ToyWebF同样使用jinja2,jinja2其实实现一种简单的DSL(领域内语言),让我们可以在HTML中通过特殊的语法改变HTML的结构,该项目非常值得研究学习。
首先 pip install jinja2 ,然后就可以使用它了,在ToyWebF项目目录中创建templates目录,以该目录作为默认的HTML文件根目录,代码如下。
首先利用jinja2的FileSystemLoader类将file system中的某个文件夹作为loader,然后初始化Environment。
在使用的过程中(即调用template方法),通过get_template方法获得具体的某个模板并通过render方法将对应的内容传递给模板中的变量。
这里我们不写前端代码,直接去互联网中下载模板,这里下载了Bootstrap提供的免费模板,可以自行去 https://startbootstrap.com/themes/freelancer/ 下载,下载完后,你会获得index.html以及对应的css、jss、img等文件,将index.html移动到ToyWebF/templates中并简单修改了一下,添加一些变量。
然后在app.py文件中为index.html定义路由以及需要的参数。
至此html文件的支持就完成了,但此时的html无法正常载入css和js,导致页面布局非常丑陋且交互无法使用。
接着就让ToyWebF支持css、js,首先在ToyWebF目录下创建static文件夹用于存放css、js或img等静态文件,随后直接将前面下载的模板,其中的静态文件复制到static中则可。
通过whitenoise第三方库,可以通过简单的几行代码让web框架支持css和js,不需要依赖nginx等服务,首先 pip install whitenoise ,随后修改API类的 __init__ 方法,代码如下。
其实就是通过WhiteNoise将self.wsgi_app方法包裹起来,在调用API的 __call__ 方法时,直接调用self.whitenoise。
此时,如果请求web服务获取css、js等静态资源,WhiteNoise会获取其内容并返回给client,它在背后会匹配静态资源在系统中对应的文件并将其读取返回。
至此,一开始的网页效果就实现好了。
web服务如果出现500时,默认会返回 internal server error ,这显得比较丑,为了让框架使用者可以自定义500时返回的错误,需要添加一些代码。
首先API初始化时,初始self.exception_handler对象并定义对应的方法添加自定义的错误
在handler_request方法进行请求调度时,调度的方法执行逻辑时报500,此时不再默认将错误抛出,而是先判断是否有自定义错误处理。
在app.py中,自定义错误返回方法,如下。
custom_exception_handler方法只返回自定义的一段话,你完全可以替换成美观的template。
我们可以实验性定义一个路由来看效果。
Web服务的中间件也可以理解成钩子,即在请求前可以对请求做一些处理或者返回Response前对Response做一下处理。
为了支持中间件,在TopWebF目录下创建middleware.py文件,在编写代码前,思考一下如何实现?
回顾一下现在请求的调度逻辑。
1.通过routes装饰器关联路由和方法 2.通过API.whitenoise处理 3.如果是请求API接口,那么会将参数传递给API.wsgi_app 4.API.wsgi_app最终会调用API.handle_request方法获取路由对应的方法并调用该方法执行相应的逻辑
如果希望在request前以及response后做相应的操作,那么其实就需要让逻辑在API.handle_request前后执行,看一下代码。
其中add方法会实例化Middleware对象,该对象会将当前的API类实例包裹起来。
Middleware.handle_request方法其实就是在self.app.handle_request前调用self.process_request方法处理request前的数据以及调用self.process_response处理response后的数据,而核心的调度逻辑,依旧交由API.handle_request方法进行处理。
这里的代码可能会让人感到疑惑, __call__ 方法和handle_request方法中都有self.app.handle_request(request),但其调用对象似乎不同?这个问题暂时放一下,先继续完善代码,然后再回来解释。
接着在api.py中为API创建middleware属性以及添加新中间件的方法。
随后,在app.py中,自定义一个简单的中间件,然后调用add_middleware方法将其添加。
定义好中间件后,在请求调度时,就需要使用中间件,为了兼容静态文件的情况,需要对css、js、ing文件的请求路径做一下兼容,在其路径中加上/static前缀
紧接着,修改API的 __call__ ,兼容中间件和静态文件,代码如下。
至此,中间件的逻辑就完成了。
但代码中依旧有疑惑,Middleware类中的 __call__ 方法和handle_request方法其调用的self.app到底是谁?
为了方便理解,这里一步步拆解。
如果没有添加新的中间件,那么请求的调度逻辑如下。
在没有添加中间件的情况下,self.app其实就是API本身,所以 middleware.__call__ 中的self.app.handle_request就是调用API.handle_request。
如果添加了新的中间件,如上述代码中添加了名为SimpleCustomMiddleware的中间件,此时的请求调度逻辑如下。
因为注册中间件时,Middleware.add方法替换了原始Middleware实例中的app对象,将其替换成了SimpleCustomMiddleware,而SimpleCustomMiddleware也有app对象,SimpleCustomMiddleware中的app对象,才是API类实例。
在请求调度的过程中,就会触发Middleware类的handle_request方法,该方法就会执行中间件相应的逻辑去处理request和response中的数据。
当然,你可以通过Middleware.add方法添加多个中间件,这就会构成栈式调用的效果,代码如下。
启动web服务后,其执行效果如下。
⑽ 最常用Python开源框架有哪些
django
flask等等
建议先把django学会,慢慢来,举一反三。前期比较困难。