Flask開發接口(二)


Flask開發接口

 

在之前那篇直接操作數據庫的基礎上作出的改進,這個版本可能更加適合項目中的使用,同樣實現倆個功能,增加和查詢功能,基本機構如下:

操作步驟:

1.在app下,新建一個 __init__.py文件,這里是項目結構,在藍本中定義路由地址

# 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中定義的錯誤處理的調用

# 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接口業務邏輯,查詢與請求

# 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.py

# 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文件,這是項目的啟動文件

 

 

 

# 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.   查詢數據

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM