如何在Notebook中用Python开发Web服务器?
Flask是什么?
Web服务框架,就是网站后台程序的代码模板,可以用它快速创建服务器程序。
安装Flask
直接在Anaconda的Notebook内执行:
conda install flask
然后就会输出很多信息,等待安装完成即可。
编写最简服务器
实际上并不能直接在Notebook内运行Flask程序,但我们可以先创建一个py文件,然后再从Notebook中运行它。
%%writefile xx.py
这种魔术写法可以从Notebook内创建.py文件。
直接从Flask官网复制案例代码,如下:
%%writefile run.py
from flask import Flask, escape, request
app = Flask(__name__)
@app.route('/')
def hello():
name = request.args.get("name", "World")
return f'Hello, {escape(name)}!'
上面这个代码创建了一个run.py
文件,就保存在Notebook文件一起。
运行服务器
然后我们可以再从Notebook中运行它,最好的办法是使用Python的subprocess子进程管理工具,代码如下。
import subprocess as sp
try:
server.terminate()
except:
pass
server = sp.Popen("FLASK_APP=run.py flask run --port=8032", shell=True)
server
这里的FLASK_APP=run.py flask run
同样来自Flask官网。注意应该先终止之前的服务程序。正常的话可以在终端得到类似下图的提示。
测试网页
依照Flask官方说法,服务器默认运行在5000端口,但被我们修改到了port=8082
,所以在浏览器打开http://127.0.0.1:8082/?name=zhyuzh
,这里的127.0.0.1
也可以换为localhost
。正常可以得到下图:
这里的?name=zhyuzh
对应了上面的request.args.get("name", "World")
的参数,如果它的话World
就是默认名字。
文件服务
导入send_from_directory
可以实现对文件的路由,就是把用户发来的地址栏路径对应到一个网页文件夹。代码如下:
%%writefile run.py
from flask import Flask, escape, request, send_from_directory
app = Flask(__name__)
@app.route('/hello')
def hello():
name = request.args.get("name", "World")
return f'Hello, {escape(name)}!'
@app.route('/web/<path:path>')
def send_js(path):
return send_from_directory('web', path)
if __name__ == "__main__":
app.run()
这里面的/web/<path:path>
对应了下面的send_from_directory('web', path)
,也就是把http://127.0.0.1:8032/web/index.html
对应到了./web/index.html
文件。
用下面的代码生成index.html
文件:
%%writefile ./web/index.html
<!DOCTYPE html>
<form action="/hello">
<label for="name">name:</label><br>
<input type="text" id="name" name="name" value="Tom"><br>
<input type="submit" value="Submit">
</form>
上面这个代码是个包含一个name输入框和一个提交按钮的表单,点击按钮就会将name输入框的数据发送到服务器/hello
路由上。
再次运行服务:
import subprocess as sp
try:
server.terminate()
except err:
pass
server = sp.Popen("FLASK_APP=run.py flask run --port=8032", shell=True)
server
然后打开http://127.0.0.1:8032/web/index.html
就会看到网页如下:
随便输入一个名称,然后点击提交,就会跳转到/hello
地址,自动问好:
附加
实际上现代的Web页面都是前后端分离的,也并不会使用form
表达这种提交方法,更不会一点击按钮就跳转页面。更多的web前后端分离思路请学习以下内容:
- JQuery的Ajax提交数据方式
- Bootstrap的界面美化框架
- Vue数据绑定界面自动化更新
这里并没有介绍连接数据库和实现更复杂的路有效果,后续还会更新更多的技术文章,敬请关注。
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~
END