最近要快速做一些DEMO,所以直接用了web.py做后台web服务,记录下最基本最简单使用方法,理解一下它的逻辑。
web.py的介绍就不说了,一搜就有,直接开始。
-------------------------------------
我的环境是这样的:
系统:ubuntu 22.04
python: 3.8 (conda环境)
如果大家用下来和我经历的不一样,那就再琢磨琢磨,总会解决的~
-------------------------------------
pip install web.py
安装过程没出现什么麻烦
import web
if __name__ == "__main__":
urls = (
'/index','Index',
'/(js|css|images)/(.*)', 'Static',
'/poststh', 'Process',
)
app = web.application(urls, globals())
app.run()
urls:就是指定路由是啥,然后每个路由对应哪个类。
url的写法可以直接写对的字符串,也可以用正则表达式来匹配对应的字符串。
注意的是url有多级路由的话,那么类里对应get或post的参数就得一一对应,比如:
urls = (‘/first/second/third’, 'Test')
这个url有3级,分别是first, second, third,那么Test里get和post对应的参数就得有三个,后面例子可以看到。
最后的两行,这么写就行。
比如上面例子里,前两个,获取静态的内容,类这么写,主要是用get方式获取:
class Index:
def GET(self):
# 读取 index.html 文件内容
with open('index.html', 'r') as file:
html_content = file.read()
return html_content
class Static:
#这里的参数取决于url,有几级就必须写几个参数,一一对应
def GET(self, media, file):
with open(media+'/'+file, 'r') as file:
html_content = file.read()
return html_content
这里注意的就是上面说的,url的几级对应这里的get或post的参数,比如例子里:
url是 '/(js|css|images)/(.*)', 那对应到Static类的GET方法参数里,media就是(js|css|images),file就是(.*),GET方法里就能获得这两块的值,然后进行处理。
要返回动态内容的话,需要获取传上来的参数,这里以POST方式请求为例,分别对不同的content-type有不同接收参数的方法:
class Test:
def POST(self):
#------------------------------------------------------------------
#content-type 是form-data,传文件上来时,my_file是关键词
upload = web.input(my_file={})
file_value = upload['my_file'].value
#保存文件
file_path = f"/home/test/website/test.file"
with open(file_path, 'wb') as f:
f.write(file_value)
#------------------------------------------------------------------
# 和上面看情况选择的用
#content-type 是 application/json时: web.data就是参数,用json.loads转换为字典
data = json.loads(web.data())
my_key_value = data['my_key']
#------------------------------------------------------------------
# 和上面看情况选择的用
#content-type 是 x-www-form-urlencoded 时,:
data = web.input()
my_key_value = data['my_key']
#------------------------------------------------------------------
#开始处理
#------------------------------------------------------------------
#返回给前端用json的话,要加上这句:
web.header('content-type','text/json')
#最终返回
dict_res = {}
dict_res["res"] = 0
return json.dumps(dict_res, ensure_ascii=False)
选择运行这个服务,只需要执行写的这个python入口文件(假设叫main.py):
python mian.py 8888
后面的8888 是端口号,想监听哪个端口就写哪个。
OK,到此为止,应该就能很快的写一个web服务的应用DEMO啦。