在以前那篇直接操做數據庫的基礎上做出的改進,這個版本可能更加適合項目中的使用,一樣實現倆個功能,增長和查詢功能,基本機構以下:python
操做步驟:sql
1.在app下,新建一個 __init__.py文件,這裏是項目結構,在藍本中定義路由地址shell
# coding=utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy from config import config import sys reload(sys) sys.setdefaultencoding('utf-8') db = SQLAlchemy() def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app) db.init_app(app) from .api_1_0 import api as api_1_0_blueprint app.register_blueprint(api_1_0_blueprint,url_prefix='/api/v1.0') return app
2.新建一個models.py,這裏面是數據結構數據庫
# coding=utf-8 from datetime import datetime from . import db from app.exception import ValidationError from flask import url_for class Post(db.Model): __tablename__='posts' id = db.Column(db.Integer,primary_key=True) body = db.Column(db.Text) timestamp = db.Column(db.DateTime,index=True,default=datetime.utcnow) # 全部 url_for() 方法都指定了參數 _external=True, # 這麼作是爲了生成完整的 URL,而不是生成傳統 Web 程序中常常使用的 # 相對 URL。 def to_json(self): json_post = { 'url':url_for('api.get_post',id=self.id,_external=True), 'body':self.body, 'timestamp':self.timestamp } return json_post # 由於id,和timestamp都是自動生成的,因此只須要傳body的值便可 @staticmethod def from_json(json_post): body = json_post.get('body') if body is None or body =='': raise ValidationError(u'文章內容不能爲空') return Post(body=body)
3. 新建一個api_1_0的文件夾,同時在文件夾下新建一個__init__.py的文件,這是api藍本的構造文件編程
from flask import Blueprint api = Blueprint('api',__name__) from . import posts
4. 錯誤信息errors.py的定義,其中須要引用exception.py中定義的錯誤處理的調用json
# coding=utf-8 from flask import jsonify from . import api from app.exception import ValidationError import sys reload(sys) sys.setdefaultencoding('utf-8') def bad_request(message): response = jsonify({'錯誤':'請求錯誤','信息':message}) response.status_code = 400 return response # 程序須要向客戶端提供適當的響應以處理這個異常。爲了不在視圖函數中編寫捕 # 獲異常的代碼, 咱們可建立一個全局異常處理程序。 @api.errorhandler(ValidationError) def validation_error(e): return bad_request(e.args[0])
5. posts.py接口業務邏輯,查詢與請求flask
# coding=utf-8 from flask import jsonify, request, g, url_for from app.models import Post from . import api from .. import db # 獲取文章資源GET請求 @api.route('/posts/<int:id>') def get_post(id): post = Post.query.get_or_404(id) return jsonify(post.to_json()) # 文章資源POST 插入請求 @api.route('/posts', methods=['POST']) def new_post(): post = Post.from_json(request.json) db.session.add(post) db.session.commit() return jsonify(post.to_json()), 201,{'Location': url_for('api.get_post', id=post.id, _external=True)}
6. 在更目錄下增長項目的配置文件config.pyapi
# coding=utf-8 import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config: @staticmethod def init_app(app): pass class DevelopmentConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///D://py//flask-api//data-dev.sqlite' config = { 'development': DevelopmentConfig, 'default': DevelopmentConfig }
7. 最後修改manage.py文件,這是項目的啓動文件session
# coding=utf-8 import os from app import create_app, db from app.models import Post from flask_script import Manager, Shell from flask_migrate import Migrate, MigrateCommand app = create_app(os.getenv('FLASK_CONFIG') or 'default') manager = Manager(app) migrate = Migrate(app, db) def make_shell_context(): return dict(app=app, db=db, Post=Post) manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command('db', MigrateCommand) @app.route('/') def hello(): return 'hello' if __name__ == '__main__': manager.run()
編程完成以後,可使用flask-migrate實現數據的遷移,須要執行:數據結構
1. python manage.py db init --這個命令會建立migrations文件夾
2. python manage.py db migrate –m 「initial migration」 ----migrate子命令用來建立遷移腳本
3. python manage.py db upgrade ---這個命令能把改動應用到數據庫中
執行完上述三條命令以後,會生成data-dev.sqlite這個數據庫,如今能夠經過使用postman這個工具來請求接口了
1. 新增數據
2. 查詢數據