Python 开发 web 服务的优势是开发效率高,可能只需要 java 五分之一的代码量。
Python 搭建 web 服务有许多框架,本文介绍 Django 和 bottle 两个框架。
Django
安装
首先,安装该框架
安装成功,版本是 1.11.28. 框架的文件安装在\python27\Scripts 目录下(搜索电脑中 Python 安装目录下的 Scripts 就对了)。
建立项目
先进入\python27\Scripts 目录,建立项目 jinanwx(名称随便起)
同一个目录下可以看到新建立工程的目录
开发自己模块
进入 python27\Scripts\jinanwx\jinanwx。新建我们自己的模块
jgotest01.py 里面写简单的代码如下
模块功能就是返回个 json 格式结果。
修改 urls 模块
然后需要改 urls.py 模块
目录文件如下
就这么简单,新建一个文件再修改一个文件,就成了。
启动服务
回到上一级目录启动服务
启动成功,浏览器访问试试
bottle
开发功能不是特别复杂的 web 服务,可以考虑使用 bottle 框架,它比 Django 轻量。bottle 例子在 Linux 下演示。
安装
使用 bottle 框架首先安装。一个指令搞定。
进入 Python 命令行 import bottle,没报错就是成功了。
代码
我的 web 服务就一个文件 bottleweb.py,代码如下,一些解释在代码的注释里
#coding=utf-8
from bottle import (run, route, get, post, put, delete, request, hook, response, static_file, app)
import json
import MySQLdb #本例子需要操作数据库,否则可以不写这行,这个数据库包pip估计安装不会成功,我是用yum install MySQL-python成功的
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import bottle
app = bottle.default_app()#处理静态资源需要定义,没有静态资源可以不写这行
#搭建vue脚手架前后台联调时要下面两个@hook内容,否则会报跨域访问资源的错误
@hook('before_request')
def validate():
REQUEST_METHOD = request.environ.get('REQUEST_METHOD')
HTTP_ACCESS_CONTROL_REQUEST_METHOD = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD')
if REQUEST_METHOD == 'OPTIONS' and HTTP_ACCESS_CONTROL_REQUEST_METHOD:
request.environ['REQUEST_METHOD'] = HTTP_ACCESS_CONTROL_REQUEST_METHOD
@hook('after_request')
def enable_cors():
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET,POST,PUT,DELETE,OPTIONS'
response.headers['Access-Control-Allow-Headers'] = '*'
@route('/test2020/dist/<path>')#静态资源在web服务下的地址,没放前端的静态资源这几个route和app.route可以不写
def stat(path):
return static_file(path, root='./dist/')
@app.route('/test2020/dist/static/js/<path>')
def js(path): #这几个目录我写成这样是因为vue打包完后目录结构就是dist 里面static等等
return static_file(path, root='./dist/static/js/')
@app.route('/test2020/dist/static/css/<path>')
def css(path):
return static_file(path, root='./dist/static/css/')
@get('/test2020/date')#返回某个表中的日期,看sql你就明白了
def helloins():
db = MySQLdb.connect("127.0.0.1", "yourusername", "yourpassword", "yourDBname", charset='utf8' )
cursor = db.cursor()
sql = "select DISTINCT date from testtable"
print sql
cursor.execute(sql)
data = cursor.fetchall()
jsondata={}
results=[]
for row in data:
result = {}
result['DATE'] = row[0]
results.append(result)
jsondata['code']=0
jsondata['datas']=results
return jsondata #返回json格式为了方便前端vue接收处理,其实返回各种类型都可以
@get('/test2020/helloworld')
def helloworld():
return 'hello world!'
if __name__ == '__main__':
run(host='0.0.0.0', port=2020, debug=True, reloader=True)
复制代码
bottleweb.py 所在目录执行
web 服务就启动了。浏览器访问http://127.0.0.1:2020/test2020/helloworld看效果。
如果安装了 MySQL 数据库可以测试 test2020/date 的 url 是否能返回结果
数据库只要有下面的数据就可以
前端页面是这个样子的,给用户选择某个日期。
前端是用 vue+vux 来开发的,开发完打包打出的东西上传到代码中提到的 dist 静态资源目录下。
如果觉得上面的代码有点复杂,可以把所有 route, app.route 的东西删除,把/test2020/date 语句块也删除,把 @hook 删除,MySQL 的东西删除,前端的东西也完全不考虑,就是最简单的 bottle web 服务,相当于 hello world。
建议尽量懂上面的代码,涉及了静态资源,数据库,是 web 服务必须的内容。
pip 升级的坑
分享一个遇到的 pip 的问题,我 Python 版本很低 2.6.6。本来通过安装 yum 的 epel,已经成功安装了好用的 pip。但是每次我用 pip 命令,最下方都会提示升级
You are using pip version 9.0.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
复制代码
我执行了 pip install --upgrade pip 升级,然后 pip 指令就不能用了。而且升级了之后,在想安装回低版本的 pip 就没有对应的安装包了。yum 只能找到 20.0.2 版本的(老版本会被覆盖难道?)。
http://bootstrap.pypa.io/2.6/get-pip.py
复制代码
下载了 get-pip.py 也无法安装成功。最后在上面的地址下载到了 2.6 版本的安装文件,才成功安装可以使用的 pip。
总结
相比 java,python 开发 web 代码量少,需要安装的库少,如果能满足功能和性能要求,python 可能是更好的选择。
评论