Flask Vue.js全栈开发|第3章:Flask设计User用户相关API

  • 原创
  • Madman
  • /
  • /
  • 0
  • 1733 次阅读

flask vuejs 全栈开发-min.png

Synopsis: Flask 后端针对 "用户资源" 提供部分 RESTful API,基于 token 认证,目前支持添加用户、查看单个或多个用户、修改用户,使用 HTTPie 或 Postman 测试 API 通过。下一篇将在前端使用这些 API 实现用户注册、登录与退出功能

代码已上传到 https://github.com/wangy8961/flask-vuejs-madblog/tree/v0.3 ,欢迎star

1. git

1.1 从 Github 拉取最新代码

$ git remote -v
origin  git@github.com:wangy8961/flask-vuejs-madblog.git (fetch)
origin  git@github.com:wangy8961/flask-vuejs-madblog.git (push)

$ git fetch
或者,拉取指定的远程主机上的分支,比如 origin 上的 master 分支
$ git fetch origin master

1.2 创建 dev 分支

$ git checkout -b dev
$ git branch

2. 数据库

2.1 ORM: SQLAlchemy

安装 Flask-SQLAlchemy 插件,还有数据表结构有变化后进行迁移的 Flask-Migrate 插件

(venv) D:\python-code\flask-vuejs-madblog\back-end>pip install flask-sqlalchemy flask-migrate
(venv) D:\python-code\flask-vuejs-madblog\back-end>pip freeze > requirements.txt

修改配置文件 back-end/config.py,默认使用 SQLite 数据库:

import os
from dotenv import load_dotenv

basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.env'))


class Config(object):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

修改 app/__init__.py,引入并初始化插件:

from flask import Flask
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config


# Flask-SQLAlchemy plugin
db = SQLAlchemy()
# # Flask-Migrate plugin
migrate = Migrate()


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    # Enable CORS
    CORS(app)
    # Init Flask-SQLAlchemy
    db.init_app(app)
    # Init Flask-Migrate
    migrate.init_app(app, db)

    # 注册 blueprint
    from app.api import bp as api_bp
    app.register_blueprint(api_bp, url_prefix='/api')

    return app

2.2 定义 User 用户数据模型

创建 app/models.py

from app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))  # 不保存原始密码

    def __repr__(self):
        return '<User {}>'.format(self.username)

修改 app/__init__.py,在文件末尾添加:

from app import models

2.3 第一次数据库迁移

(1) 创建迁移存储库

(venv) D:\python-code\flask-vuejs-madblog\back-end>flask db init

(2) 生成迁移脚本

(venv) D:\python-code\flask-vuejs-madblog\back-end>flask db migrate -m "add users table"

(3) 将迁移脚本应用到数据库中

(venv) D:\python-code\flask-vuejs-madblog\back-end>flask db upgrade

说明: flask db downgrade 命令可以回滚上次的迁移

2.4 存储用户密码的 hash 值

使用 werkzeug.security 库的 generate_password_hashcheck_password_hash 来创建哈希密码和验证密码的hash是否一致:

(venv) D:\python-code\flask-vuejs-madblog\back-end>python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from werkzeug.security import generate_password_hash, check_password_hash
>>> hash = generate_password_hash('foobar')
>>> hash
'pbkdf2:sha256:50000$Z39YZhom$2a59a7a0edf67db5e29632134cb1fbbfec55077a262c659de662dbe5de623329'
>>> check_password_hash(hash, 'foobar')
True
>>> check_password_hash(hash, 'barfoo')
False
>>>

更新 User 数据模型:

from werkzeug.security import generate_password_hash, check_password_hash
from app import db


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))  # 不保存原始密码

    def __repr__(self):
        return '<User {}>'.format(self.username)

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

配置 Flask Shell 上下文环境:

flask shell 命令是 flask 命令集中的另一个非常有用的工具,它是继 flask run 之后被实现的第二个 "核心" 命令,其目的是启动一个Python解释器包含应用的上下文

(venv) D:\python-code\flask-vuejs-madblog\back-end>flask shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
App: app [production]
Instance: D:\python-code\flask-vuejs-madblog\back-end\instance
>>> app
<Flask 'app'>
>>> db
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'db' is not defined

修改 back-end/madblog.py,添加一个方法:

from app import create_app, db
from app.models import User

app = create_app()


@app.shell_context_processor
def make_shell_context():
    return {'db': db, 'User': User}

再次运行 flask shell 命令:

(venv) D:\python-code\flask-vuejs-madblog\back-end>flask shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
App: app [production]
Instance: D:\python-code\flask-vuejs-madblog\back-end\instance
>>> app
<Flask 'app'>
>>> db
<SQLAlchemy engine=sqlite:///D:\python-code\flask-vuejs-madblog\back-end\app.db>
>>> User
<class 'app.models.User'>
>>> u = User(username='tom', email='tom@163.com
                                
                            
分类: Vue.js
标签: API RESTful vuejs flask
  • loveinshare
  • 499397601
  • 浮川大大
  • xiyao
  • meslam
  • 陈水水
  • 小明同学哈啊哈
  • kingbirdzheng
  • kushao163
  • fancyou
  • 1507850469
  • boylin
未经允许不得转载: LIFE & SHARE - 王颜公子 » Flask Vue.js全栈开发|第3章:Flask设计User用户相关API

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列