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 框架首先装置。一个指令搞定。
# pip install 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 所在目录执行
#python 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 可能是更好的抉择。