flask初次搭建rest服务笔记
官网中有用的记录一下,太多只是记录了最简单的
官网docs:http://flask.pocoo.org/docs/0.12/
跑起来一个程序
$ export FLASK_APP=hello.py
$ flask run
* Running on http://127.0.0.1:5000/
$ python -m flask run
* Running on http://127.0.0.1:5000/
#监听所有ip
flask run --host=0.0.0.0
# debug 永远不要用在生产环境
$ export FLASK_DEBUG=
$ flask run
#路径中有参数的使用
@app.route('/post/<int:post_id>')
@app.route('/user/<username>')
string accepts any text without a slash (the default)
int accepts integers
float like int but for floating point values
path like the default but also accepts slashes
any matches one of the items provided
uuid accepts UUID strings
#http.method
from flask improt request
@app.route('/user/<username>', methods=['GET', 'POST'])
if request.method == 'GET':......
#render render_template会找templates文件夹下的hello.html,把参数传过去
from flask import render_template
@app.route('/hello')
@app.route('/hello/<name>')
def greeting(name=None):
return render_template('hello.html', name=name)
#路径中?后的参数的获取
@app.route('/search', methods=['GET'])
def search():
word = request.args.get('key','')
return 'key word is: %s' % word
http://localhost:5000/search?key=value #浏览器输入访问
#获取前台post请求发过来的json格式的数据
import json
@app.route('/login', methods=['POST'])
def login():
return json.loads(request.data)['name']
#log
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', )
app.logger.error('An error occurred')
#错误处理
@app.errorhandler()
def page_notfound(error):
return render_template('not_found.html'),
@app.errorhandler()
def not_found(error):
resp = make_response(render_template('not_found.html'), )
resp.headers['X-Something'] = 'A value'
return resp
#捕获自定义异常处理
class RunException(RuntimeError):
def __init__(self, msg, code):
self.msg = msg
self.code = code
@app.errorhandler(RunException)
def exce(error):
return 'ERROR[msg: %s, code: %d]' % (error.msg, error.code), error.code
@app.route('/exce', methods=['GET'])
def test_e():
raise RunException('occur', )
return 'no error'
#配置文件
#http://flask.pocoo.org/docs/0.12/config/
app = Flask(__name__)
app.config['DEBUG'] = True
app.debug = True
app.config.update(
DEBUG=True
SECRET_KEY='value'
)
app.config.from_object('yourapplication.default_settings_OR_class')
app.config.from_envvar('YOURAPPLICATION_SETTINGS') class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:'
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
app.config.from_object('configmodule.ProductionConfig')
#命令行和执行代码里的方法
#http://flask.pocoo.org/docs/0.12/cli/
import click
@app.cli.command()
def initdb():
"""Initialize the database."""
click.echo('Init the db')
$ flask initdb
Init the db
@app.cli.command(with_appcontext=False) #命令行失效
def example():
pass
sqlacodegen:从已有的数据库中的表导出module(听这个官网说好像这个是sqlautocode的加强版,sqlautocode有bug)
pip install sqlacodegen
#使用方法 sqlacodegen --help查看使用方法
sqlacodegen --outfile /home/ito/workspace1/ZPyService/src/py_service/module.py mysql://root:root@localhost:3306/fzk
SQLAlchemy:orm
http://docs.sqlalchemy.org/en/rel_1_1/orm/tutorial.html
pip install SQLAlchemy #安装
pip uninstall SQLAlchemy #卸载
pip install SQLAlchemy==<version> #安装指定版本
使用
db = create_engine(<DB_URI>, echo=True)
session = sessionmaker(bind=db)()
#或者*******************************
Session = sessionmaker()
Session.configure(bind=engine)
*************************************
session.query(module.User).filter_by(username='bar').first()
session.add(a_user)
session.commit()
session.add_all([])
session.dirty
session.new
session.rollback()
session.query(User).filter(User.name.in_(['ed', 'fakeuser'])).all()
for instance in session.query(User).order_by(User.id):
print(instance.name, instance.fullname)
for name, fullname in session.query(User.name, User.fullname):
print(name, fullname)
for row in session.query(User, User.name).all():
print(row.User, row.name)
for row in session.query(User.name.label('name_label')).all():
print(row.name_label)
from sqlalchemy.orm import aliased
user_alias = aliased(User, name='user_alias')
for row in session.query(user_alias, user_alias.name).all():
print(row.user_alias)
#分页
for u in session.query(User).order_by(User.id)[1:3]:
print(u)
for name, in session.query(User.name).filter_by(fullname = 'Ed Jones'):
print(name)
for name, in session.query(User.name).filter(User.fullname == 'Ed Jones'):
print(name)
for user in session.query(User).filter(User.name=='ed').filter(User.fullname=='Ed Jones'):
query.filter(User.name.like('%ed%'))
query.filter(User.name.ilike('%ed%')) #case-insensitive LIKE
query.filter(User.name.in_(['ed', 'wendy', 'jack']))
query.filter(User.name.in_(
session.query(User.name).filter(User.name.like('%ed%'))
))
# not in
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))
# is null
query.filter(User.name == None)
query.filter(User.name.is_(None))
# is not null
query.filter(User.name != None)
query.filter(User.name.isnot(None))
#and
# use and_() Make sure you useand_()and not the Pythonandoperator!
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))
# or send multiple expressions to .filter()
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')
# or chain multiple filter()/filter_by() calls
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')
#or
from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.fullname == 'Ed Jones'))
.all()
.first()
.one() #多余一个或没有会报错 .one_or_none()nvokes the
.scalar() #ione() method, and upon success returns the first column of the row:
#count
from sqlalchemy import func
session.query(func.count(User.name), User.name).group_by(User.name).all()
session.query(func.count('*')).select_from(User).scalar()
#join
for u, a in session.query(User, Address).\
... filter(User.id==Address.user_id).\
... filter(Address.email_address=='jack@google.com').\
... all():
session.query(User).join(Address).\
... filter(Address.email_address=='jack@google.com').\
... all()
query.join(Address, User.id==Address.user_id) # explicit condition
query.join(User.addresses) # specify relationship from left to right
query.join(Address, User.addresses) # same, with explicit target
query.join('addresses')
query.outerjoin(User.addresses) # LEFT OUTER JOIN
#一对多 多条数据从一次查询获取
from sqlalchemy.orm import aliased
>>> adalias1 = aliased(Address)
>>> adalias2 = aliased(Address)
for username, email1, email2 in \
... session.query(User.name, adalias1.email_address, adalias2.email_address).\
... join(adalias1, User.addresses).\
... join(adalias2, User.addresses).\
... filter(adalias1.email_address=='jack@google.com').\
... filter(adalias2.email_address=='j25@yahoo.com'):
... print(username, email1, email2)
#exist()
>>> from sqlalchemy.sql import exists
>>> stmt = exists().where(Address.user_id==User.id)
>>> for name, in session.query(User.name).filter(stmt):
flask-restful-swagger-2: https://github.com/swege/flask-restful-swagger-2.0flask-restful-swagger : https://github.com/rantav/flask-restful-swagger
flask初次搭建rest服务笔记的更多相关文章
- Flask框架搭建REST-API服务
一.目的 为了能够将测试工具部署成RESTful-API服务,这样就能通过接口的方式提供统一测试工具服务,使用人员就不用构建application而产生的各种环境问题.使用问题. 适合人群:Pytho ...
- CentOS搭建pptpd服务笔记
pptpd.rpm 包下载.http://poptop.sourceforge.net/yum/stable/packages/ 参考资料:http://www.oschina.net/questio ...
- 《用OpenResty搭建高性能服务端》笔记
概要 <用OpenResty搭建高性能服务端>是OpenResty系列课程中的入门课程,主讲人:温铭老师.课程分为10个章节,侧重于OpenResty的基本概念和主要特点的介绍,包括它的指 ...
- 搭建VPN服务器之PPTP
搭建VPN服务器之PPTP 1. 查看系统是否支持PPP 一般自己的系统支持,VPS需要验证. [root@oldboyedu ~]# cat /dev/ppp cat: /dev/ppp: No s ...
- 树莓派+花生棒+leanote搭建自己的笔记服务器
背景 对于一个程序猿来说.女朋友可以(暂时)没有,但是不能没有一个很好的记笔记的应用.因为记笔记可以帮助自己积累学习提升自己.每一次回头看自己记得笔记,你都会有新的理解. 也许有人会说,用有道云啊,有 ...
- 【转】在Win7的IIS上搭建FTP服务及用户授权
[转]在Win7的IIS上搭建FTP服务及用户授权 [转]在Win7的IIS上搭建FTP服务及用户授权 FTP服务 FTP是文件传输协议(File Transfer Protocol)的简称,该协议属 ...
- 十分钟搭建微服务框架(SpringBoot +Dubbo+Docker+Jenkins源码)
本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-06 服务注册和发现之Eureka Client搭建商品服务实战
笔记 6.服务注册和发现之Eureka Client搭建商品服务实战 简介:搭建用商品服务,并将服务注册到注册中心 1.创建一个SpirngBoot应用,增加服务注册和发现依赖 2.模 ...
- 基于Flask框架搭建视频网站的学习日志(一)
------------恢复内容开始------------ 基于Flask框架搭建视频网站的学习日志(一)2020/02/01 一.Flask环境搭建 创建虚拟环境 初次搭建虚拟环境 搭建完虚拟环境 ...
随机推荐
- js:获得时间
<script type="text/javascript"> function bodyLoad() { var dateTime = new Date(); var ...
- 如何创建JAR文件?如何运行.jar形式的Java程序?
一.如何创建JAR文件? .jar是用来压缩档案或者解压档案的文件格式,其特点是具有无损压缩的功能.想知道如何创建这种程序?请访问 http://www.cnblogs.com/yjmyzz/p/ex ...
- 征信报告页面的input验证收集
https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ...
- 更改 Nginx 服务的默认用户
为什么要更改 Nginx 服务的默认用户:就像更改 ssh 的默认 22 端口一样,增加安全性,Nginx 服务的默认用户是 nobody ,我们更改为 nginx 1.添加 nginx 用户 use ...
- 解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题
解决Windows平台通过cURL上传APP到蒲公英pgyer平台时无法使用中文升级描述的问题 官方上传命令 curl -F file=@"315.apk" -F uKey=XXX ...
- Verilog利用$fdisplay命令往文件中写入数据
最近在做的事情是,用FPGA生成一些满足特定分布的序列.因此为了验证我生成的序列是否拥有预期的性质,我需要将生成的数据提取出来并且放到MATLAB中做数据分析. 但是网上的程序很乱,表示看不懂==其实 ...
- stage3D基础一-----Stage3D如何工作(转)
在如何使用Stage3D系列中的第一个教程中,你将会学习到有关在Flash Player 11中新引入的ActionScript API,该API允许在Flash中利用硬件加速进行3D渲染.在学习这个 ...
- JavaScript的split()
JavaScript split() 方法 JavaScript String 对象 定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(s ...
- 调整jvm内存
1.使用解压tomcat 在catalina.bat的第一行增加: set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNew ...
- 浅谈 MVP in Android(转)
我自己写的demo:https://pan.baidu.com/s/1dFImVYD 一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让 ...