8. Flask个人博客实战-API接口

现在做项目一般是有API接口的,这样做小程序,还是APP,只要获取API接口就可以了,这样前后端分离,各管各事。在做API时我们先看介绍一篇postman工具的API介绍。 现在我们看下我们的项目结构分析下有几个模块,并且可提供哪些功能API

用户模块

  • 用户授权 access_token (jwt)

  • 用户修改(这里暂时提供修改昵称与密码)

文章模块

- 文章列表 (可获取所有文章,或者是指定的栏目文章)
- 文章详情(获取指定ID的文章详情,并同布获取对应的栏目信息)

API他涉及到跨域问题,所以我们需要一个扩展

pipenv install flask-cors

还有一个插件 处理API后面的参数与验证,比如category?id=1这里可以验证必须是int并且是必须指定。

pipenv install webargs

我们开始做第一个用户授权

/app/api/v1/auth.py

# /app/api/v1/auth.py

from flask import current_app, request, jsonify
from functools import wraps
from app.models.user import User
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
from flask_login import login_user, current_user
from app.models.article import Article

# 生成token
def generate_token(user):
    expitation = 864000
    s = Serializer(current_app.config['SECRET_KEY'], expires_in=expitation)
    token = s.dumps({'id': user.id}).decode('ascii')
    return token, expitation


# 验证token
def validate_token(token):
    s = Serializer(current_app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
    except (BadSignature, SignatureExpired):
        return False
    if login_user(User.query.get_or_404(data['id'])):
        current_app.logger.info('验证token成功,并登陆login_user')
        return True

# 从request的header里去获取token
def get_token():
    if 'Authorization' in request.headers:
        try:
            token_type, token = request.headers['Authorization'].split(None, 1)
        except ValueError:
            token_type = token = None
    else:
        token_type = token = None
    return token_type, token


def auth_required(f):
    """验证token授权认证"""
    wraps(f)

    def decorated(*args, **kwargs):
        token_type, token = get_token()
        if request.method != 'OPTIONS':
            if token_type != 'Bearer':
                return jsonify(success=False, message="授权头不对")
            if token is None:
                return jsonify(success=False, message="没有授权信息")
            if not validate_token(token):
                return jsonify(success=False, message="授权失败", code=1001)
        return f(*args, **kwargs)

    return decorated

/app/api/v1/resources/token.py

再创建表单

/app/api/forms.py