官網中有用的記錄一下,太多只是記錄了最簡單的
官網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=1 $ 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)', 42) app.logger.error('An error occurred')
#錯誤處理
@app.errorhandler(404) def page_notfound(error): return render_template('not_found.html'), 404 @app.errorhandler(404) def not_found(error): resp = make_response(render_template('not_found.html'), 404) 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', 1001) 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 use and_()
and not the Python and
operator!
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.0
flask-restful-swagger : https://github.com/rantav/flask-restful-swagger