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

d76672f07dd71820504551edb75ef758.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-codeflask-vuejs-madblogback-end>pip install flask-sqlalchemy flask-migrate (venv) D:python-codeflask-vuejs-madblogback-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.pyfrom 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-codeflask-vuejs-madblogback-end>flask db init
(2) 生成迁移脚本
(venv) D:python-codeflask-vuejs-madblogback-end>flask db migrate -m "add users table"
(3) 将迁移脚本应用到数据库中
(venv) D:python-codeflask-vuejs-madblogback-end>flask db upgrade
说明: flask db downgrade 命令可以回滚上次的迁移
2.4 存储用户密码的 hash 值
使用 werkzeug.security 库的 generate_password_hashcheck_password_hash 来创建哈希密码和验证密码的hash是否一致:
(venv) D:python-codeflask-vuejs-madblogback-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-codeflask-vuejs-madblogback-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-codeflask-vuejs-madblogback-endinstance >>> 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-codeflask-vuejs-madblogback-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-codeflask-vuejs-madblogback-endinstance >>> app <Flask 'app'> >>> db <SQLAlchemy engine=sqlite:///D:python-codeflask-vuejs-madblogback-endapp.db> >>> User <class 'app.models.User'> >>> u = User(username='tom', email='tom@163.com

剩余文章可跳转链接:

Flask Vue.js全栈开发|第3章:Flask设计User用户相关API​www.madmalls.com
79a120a27d9058c6df9a9c6bf43ec62c.png

该文章转载自:www.madmalls.com

记得留言讨论哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值