Ⅰ 十四个Python Web框架Hello Wold示例
1、Dganjo
新建一个django项目,HelloWorld
vim Hello/views.py
vim HelloWorld/HelloWorld/urls.py
vim HelloWorld/HelloWorld/settings.py
运行启动命令:
2、Flask
3、Pyramid
4、web.py
5、Tornado
6、TurboGears
7、CherryPy
8、Falcon
9、Asgineer
10、Bottle
11、Twisted
12、Hug
13、FastAPI
14、Quart
Ⅱ Python 如何开发高效漂亮的轻量级 Web 应用
痛点
从我开始折腾数据分析工具的那一天,就没有想明白一件事儿 —— 我打算把数据分析的成果做成一个 Web 应用,为什么这么难?
我需要的核心功能,无非是在网页上接收用户输入,然后做分析处理,把分析结果反馈给用户,完事儿。
可是这谈何容易?
很多人都会微笑着告诉你,想做 Web 应用?这得学前端编程, HTML + Javascript 了解一下吧!
什么?你还需要在后台做数据分析?那你就得学 Web 框架了。
你说喜欢 Python ?那就学个 Django 或者 Flask 好了。
我也不是没有看过 Django 和 Flask 的教程,还曾经付费学习过。光是 Django 配置环境,就够写一章出来。
作为学习的中间成果,我还写了这篇《如何用 Python 做 Web 开发?——Django 环境配置》分享给你。
真正让我痛苦的,不是 Web 框架的操作有多么琐碎,而是教程里的案例,为什么都那么奇怪?
几乎所有的教程,都指向一个目标:
来,我教你做一个 blog 出来!
我用你教?!
我要是想用 blog ,可以直接注册一个免费的啊!为什么我要自己开发个 blog 出来?
为什么你就不能告诉我,该怎么把我目前的数据分析结果,迅速挪到 Web 页面上,跟用户实时交互?
虽然二者的结果,都是做一个 Web 应用出来。但是,它们关注的焦点,需要的功能,能一样吗?
但是人家写书和做教程的人,就是不疾不徐,坚持一定要教会你,如何做一个 blog 出来……
你不学,又能怎么办呢?你难道想只凭 Python 脚本,就做一个 Web 应用出来?
还真别说,最近,这个事儿从幻想,变成了现实。
样例
这不,我就用纯 Python 脚本写了个 Web 应用。
我编写的代码里,没有一丝半毫的 Web 框架,Javascript,甚至是 HTML 。
这玩意儿能用吗?
你自己来试试看。
请你打开浏览器,输入以下链接:https://helloworld-streamlit.herokuapp.com/
你会看到下面的初始化界面。
初始化完毕之后,页面会分成左右两栏。左面是两个下拉候选框,分别让你指定需要分析的数据范围。
上面一个,是事件类型;
下面一个,是事件发生归属地。
如果你看过我的文章《如何用 Python 和循环神经网络预测严重交通拥堵?》,应该对这个数据集很熟悉。
只不过,当时我们更注重的,是用循环神经网络搭建了一个严重拥堵事件预测模型。
而今天,我们是要进行探索性数据分析,也就是根据我们感兴趣的目标,对数据进行整理操作,然后可视化显示。
选定之后,你会看到右侧提示两个信息:
你筛选之后,数据框包含行数
在层叠地图上的可视化结果。
怎么样?
麻雀虽小,五脏俱全。
虽然咱们这个 Web 应用很简单,不过交互分析该有的功能和流程,基本上都涵盖了。
你可能会问:
王老师,编这么一个应用出来,不简单吧?
让我带你到幕后,看看是不是很复杂。
幕后
我把这个应用的全部源代码,都为你存储到了 Github 上。请你访问这个网址获取:https://github.com/wshuyi/demo-helloworld-streamlit
可以看到,一共包含了 4 个文件。
有意思的是,其中 3 个,包括:
Procfile
setup.sh
requirements.txt
都只是部署到远程服务器时,需要用到的配置文件而已。
也就是说,只有最后一个helloworld.py是主角,它包含了实现咱们全部交互式数据分析功能的 Python 脚本文件。
这代码,少说也得有几百行吧?
别担心,打开来看看:
上面这张截图,就已经包含了实现交互数据分析功能的全部代码。
神奇吧?
解读
这么短的代码,为什么能有如此强大的功能?
这是因为它背后使用的一个软件包,叫做streamlit。
它是干什么用的?
一言以蔽之,给你赋能,让你能够不去操心什么前端后端。只写 Python ,只关注功能,你就能写出一个交互式 Web 应用出来。
当然,既然最后是 Web 应用,那么实际上前后端的功能都是齐备的。
只不过,这些交由 Streamlit 来帮你费心操办。你根本不用管。
爆发
为什么会有人做了这么一款神器出来?
原因很简单,咱们前面提到的痛点,是大伙儿都有的。
咱们这些麻瓜(Muggle),遇到痛点只能忍着。
但是真正的魔法师(优秀程序员),是忍不了的。
在这段来自 PyData LA 2019 的视频里,Streamlit 的 CEO Adrien Treuille 谈及了他在数据智能企业中,长期遭遇的痛点。
最大的痛点,就是数据科学家训练好机器学习模型后,需要验证效果,和用户反馈沟通。
但是,做机器学习的工程师本身,并不掌握这一整套的工具栈。
所以,就得在把全部的数据分析和模型训练工作完成后,把这东西移交给一个工具制作团队。
人家做完以后,就告诉数据科学团队说,做好了。但是注意,现在处于需求冻结阶段。这个应用你们可以随便用,只是别乱改。改坏了我们管不了。因为最近两个月,我们还得给其他若干数据分析团队做 app 。大概几个月以后,我们又能回来帮助你们了……
Adrien Treuille 很敏锐地捕捉到了这个长期痛点,于是在 2018 年, 创立了 streamlit 。
目标很简单,给数据科学团队提供简单的工具,让他们使用已经掌握的 Python 编程技能,就能直接做 Web 应用。
什么 “等上两三个月不许改”?!你们自己慢慢儿玩儿去吧,我们想怎么改,就怎么改!
至于做出来的东西嘛,可以是这样的:
资源
看到这里,是不是心动了?也打算学习一下 Streamlit ?
没问题,我前面给你提供的样例,就在 github 上,你可以直接查看源码。
如果你希望重现这个小应用,并且一步步学习掌握 Streamlit 的基础知识和技能,我也已经为你写好了一份手把手的教程。地址在这里https://sspai.com/post/58474。
它不仅教你如何设置环境,安装工具,写作代码,甚至连如何免费部署到 heroku 平台,让用户使用,都毫无保留地教给了你。
那篇文章,我用于参加少数派年度征文活动,所以就不能全文展示在这里了。
读完以后,如果你觉得有收获,欢迎在少数派平台上帮我点个赞。谢谢支持!
思考
尝试过之后,你应该不难发现,Streamlit 给你带来了什么。
如果你学过 Javascript 和 Flask, Django 等 Web 应用开发技术,Streamlit 可以加快你的 Web 应用开发与测试进程。
如果你还没有学过上述技术, Streamlit 可以给你赋能,让你一下子有了把数据分析结果变成产品的能力。
给你讲点儿更激进的。
有人已经希望能用它替代掉 Flask 用于产品发布了。
还有人说,将来写技术文档,也应该充分使用 Streamlit 。
甚至,还把它比作了数据科学界的 iPhone 。
这里,它是借喻 iPhone 开启智能手机时代,说明 Streamlit 的划时代性。
我不希望你也变得如此激进。
因为这里提到的每一种功用,现在还都有非常专业的工具做的更好,而且新的工具也在不断涌现。
例如说,我们在多个教程中一直使用 Jupyter Notebook 。
现在凭借 Voila 扩展的加持,你也可以很轻松地把 Jupyter Notebook 变成 Web app ,而且可以免费运行在 mybinder 上面。
但是,你可以看到,一个新的工具,以一种简单,而不是更繁复的办法,解决一个功能痛点,是一件多么令人欣喜的事儿。
看了这篇文章,可能会给你一种误解,似乎 JavaScript 为代表的前端编程技术,再也不需要学了。
其实不是这样的。
可以想象,开发门槛降低以后,将来会有更多的人使用 Python 来做 Web 应用。
用 Streamlit 这样的方法,他们只是开发出了一个原型。
要是想打造精品,就必须精细调控很多细节。
这时候, 如果你精通 Javascript ,那你潜在的合作对象一下子就多了起来,你掌握的这门技术,也就有了更大的价值。
还记得吗?我不止一次给你强调过,比起一个工具自身的能力来,协作网络更重要。忘了的话,记得复习《学 Python ,能提升你的竞争力吗?》。
这就好像印刷术的发明,不是让会写字这件事儿变得失去价值,而是全社会都增大了对好作品的渴求。深刻的思考,加上有效的文字表达,会让你生存得更好。
当然,如果你不希望精通写作技艺,只是想做一个抄书匠糊口。那么印刷术就可能会替代你的工作,结果就不那么美妙了。
小结
这篇文章,我为你介绍了 Streamlit 这款有趣的工具。希望你读过之后,掌握了以下知识点:
借助 Streamlit ,你可以用纯 Python 编制 Web 应用;
学 Web 设计依然很有前途,因为你的潜在合作群体正在迅速扩大;
不要惹魔法师(优秀程序员)。他们的痛点需求会转化成无尽的战斗力,兴许会直接替掉你的日常工作。
更多Python知识,请关注:Python自学网!!
Ⅲ 如何用Python做Web开发
Python的Web开发,也是工作岗位比较多的领域。
一、基于Python的代表性Web框架
下面是一些比较有代表性的框架:
Django:
Python 界最全能的 Web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒。常有人说 Django 慢,其实主要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,取决于项目对数据库交互的要求以及各种优化。而对于 Django 的同步特性导致吞吐量小的问题,其实可以通过 Celery 等解决,倒不是一个根本问题。Django 的项目代表:Instagram,Guardian。
Ⅳ 如何用python搭建一个最简单的Web服务器
用Python建立最简单的web服务器
利用Python自带的包可以建立简单的web服务器。在DOS里cd到准备做服务器根目录的路径下,输入命令:
python -mWeb服务器模块[端口号,默认8000]
python -m SimpleHTTPServer 8080
http://localhost:端口号/路径
http://localhost:8080/index.htm(当然index.htm文件得自己创建)
BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler。
SimpleHTTPServer: 包含执行GET和HEAD请求的SimpleHTTPRequestHandler类。
CGIHTTPServer: 包含处理POST请求和执行CGIHTTPRequestHandler类。
例如:
然后就可以在浏览器中输入
来访问服务器资源。
例如:
其他机器也可以通过服务器的IP地址来访问。
这里的“Web服务器模块”有如下三种:
Ⅳ 如何用 Python 实现 web 工作流程
Python下的工作流大多还是zope实现的,zope版本实现的比较完善,但zope代码比较难懂,除此之外推荐如下这些:
- repoze.workflow http://docs.repoze.org/workflow/
- goflow https://code.djangoproject.com/wiki/GoFlow
Ⅵ python编程例子有哪些
python编程经典例子:
1、画爱心表白、图形都是由一系列的点(X,Y)构成的曲线,由于X,Y满足一定的关系,所以就可以建立模型,建立表达式expression,当满足时,两个for循环(for X in range;for Y in range)就会每行每列的打印。
(6)pythonweb编程实例扩展阅读:
Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出,而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出,缩进成为了语法的一部分。
Ⅶ 如何用Python写一个web框架
STEP.1
我们首先得选择基于什么协议来写这种框架。我们可以选择CGI协议,或者是WSGI接口。如果使用CGI,实际上我们只是按着CGI的规范写了一个python程序,然后每次服务器收到请求,就fork一个程序来执行它,然后返回一个http文档,性能比较低下。对于WSGI,而是一个存在于服务器和应用间的接口,在WSGI之前,web应用都是依赖于服务器的,现在流行的python框架都支持WSGI接口。
STEP.2 PEP-333
这一段是PEP-333 所提供的样例代码。
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world!
']
这里的application被传入了两个值。
environ
start_response。
environ是一个字典,保存了http请求的信息。
start_response是一个函数,发送http响应。她有两个参数status 和 start_headers。status必须是由状态编号和具体信息组成的字符串,必须符合RFC 2616。
start_headers是一个(header_name,header_value) 元组的列表元组列表。其中的hearder_name必须是合法的http header字段名。在RFC 2616, Section 4.2中有详细定义。
当然官方还给出了类的实现。- def __init__(self, environ, start_response):
- self.environ = environ
- self.start = start_response
- def __iter__(self):
- status = '200 OK'
- response_headers = [('Content-type','text/plain')]
- self.start(status, response_headers)
- yield "Hello world! "
- urls = [('^/index/$','func_index'),
- ('^/comment/$','func_comment'),
- ('^/environ/$','get_environ'),
- ('^/post/$','post_test')]#urls是提供给app开发者来做链接的。
- def getPage(self):
- path = self.environ['PATH_INFO']
- for pattern in self.urls:
- m = re.match(pattern[0],path)#将urls元素的第0项和path进行比对,如果匹配上了,返回函数名
- if m:
- function = getattr(self,pattern[1])#getattr方法来得到函数
- return function()
- return '404 not found'#没匹配上任何东西
- def getTemplate(self,tem_name,rep=0):
- #这个函数返回内容,tem_name是文件名字
- #参数rep是一个字典,默认为0
- f = open('template/'+tem_name)
- html = f.read()
- if(rep!=0):
- for to_replace in rep:
- strinfo = re.compile('{\%s*'+str(to_replace)+'s*\%}')
- html = strinfo.sub(rep[to_replace],html)
- return html
- environ['wsgi.input'] = sys.stdin
- def getPost(self):
- if(self.environ['REQUEST_METHOD'] == 'POST'):
- try:
- request_body_size = int(self.environ.get('CONTENT_LENGTH', 0))#读出content_length的值
- except:
- request_body_size = 0
- request_body = self.environ['wsgi.input'].read(request_body_size) #请求的body
- post_data = parse_qs(request_body)#parse_qs是cgi提供的方法,帮助我们处理请求
- return post_data
- import MySQLdb
- class Model(object):
- def __init__(self):
- self.host = 'localhost'
- self.port = 3306
- self.user = 'admin'
- self.passwd = 'admin'
- self.db = 'xieyi'
- def build_connect(self):
- self.conn = MySQLdb.connect(
- host = self.host,
- port = self.port,
- user = self.user,
- passwd = self.passwd,
- db = self.db
- )
- def exec_ins(self,ins):
- cur = self.conn.cursor()
- num = cur.execute(ins)
- info = {}
- if(num>0):
- info = cur.fetchmany(num)
- cur.close()
- self.conn.commit()
- return info
- def close(self):
- self.conn.close()
了解了如上信息后,基本上可以开始了。我们就到官方给的代码上进行修改吧。
STEP.3 将路径链接到函数
首先我们得把用户请求的路径,链接到函数。我们可以实现一个getPage方法,专门做这件事。我们所拥有的信息,只有environ['PATH_INFO']。
写到这里之后,每次添加页面,就只需要在urls列表中添加一个元祖就行了。
STEP.4 获取模版
既然是写web app,模版肯定是得有的。这里我提供了一种getTemplate方法来做这件事。不过我只提供了变量的替换。
STEP.5 POST数据的处理
要想获取POST数据,我们得通过environ['wsgi.input']来处理。而他实际上就是系统的标准输入。
知道这点后就很好写了。
数据库的链接
STEP.6 清理工作
很多配置如果放到代码中,会增加阅读负担。于是把urls,model抽取出来。
使得配置更加方便。