基於Flask開發企業級REST API應用(四)

關於我
一個有思想的程序猿,終身學習實踐者,目前在一個創業團隊任team lead,技術棧涉及Android、Python、Java和Go,這個也是咱們團隊的主要技術棧。
Github:github.com/hylinux1024
微信公衆號:終身開發者(angrycode)linux

0x00 配置緩存服務

幾乎如今全部應用都會用到緩存技術,而在服務器端redis是不少實現緩存的首選技術。git

對於咱們這個應用也是須要使用緩存技術提升接口訪問速度。github

首先安裝redis,並啓動redis服務。redis

下載並編譯安裝sql

wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
複製代碼

啓動服務數據庫

src/redis-server
複製代碼

使用redis命令行客戶端鏈接測試json

src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
複製代碼

建議詳細的配置能夠參閱相關官方文檔。本文的重點仍是關注在項目中的使用。flask

安裝依賴

安裝緩存

pip install redis
複製代碼

(固然,你也可使用Flask-Cache這個插件,使用起來也挺方便,不過本文延續以前的一些歷史代碼,就是直接使用redis這個庫)bash

而後對redis作了一個簡單的封裝,分別是建立實例,設置緩存和獲取緩存共三個靜態方法。

import redis
import json
import datetime

# 建立鏈接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)

class Redis:
 @staticmethod
    def connect(db=0):
        """默認使用0號庫"""
        r = redis.Redis(connection_pool=pool, db=db)
        return r

    # 將內存數據二進制經過序列號轉爲文本流,再存入redis
 @staticmethod
    def set(r, key: str, data, ex=None):
        r.set(key, json.dumps(data, cls=CJsonEncoder), ex=ex)

    # 將文本流從redis中讀取並反序列化,返回
 @staticmethod
    def get(r, key: str):
        data = r.get(key)
        if data is None:
            return None

        return json.loads(data)
複製代碼

在須要使用緩存的模塊中經過如下方式進行獲取redis實例

r_cache = redis_helper.Redis.connect(db=5)
複製代碼

因爲我本機中還有其它的服務在開發,因此我選擇5號庫做爲緩存,避免與其它服務發生衝突。

0x01 SQLAlchemy中實體關係的表示

前面幾講對模型中的關係在SQLAlchemy中的表示沒有詳細的說明,今天來拆解一下。

咱們以用戶表(UserInfo)與受權表(UserAuth)進行說明。

class UserInfo(db.Model):
    """用戶基本信息"""
    __tablename__ = 'user_info'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(64))  # email
    nickname = db.Column(db.String(64))
    phone = db.Column(db.String(16))
    gender = db.Column(db.Integer)  # 1男2女0未知
    ...

class UserAuth(db.Model):
    """受權登陸表"""
    __tablename__ = 'user_auth'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user_info.id'))
    user_basic = db.relationship(UserInfo, backref=db.backref('user_auth', uselist=False))
    ...
複製代碼

UserInfoUserAuth是一對一的關係。即一個用戶對應一個受權信息,在SQLAlchemy中表示關係是使用db.relationship()接口

UserAuth中定義外鍵user_id時須要指定db.ForeignKey('user_info.id'))參數,說明是關聯的是user_info表中的id字段。經過外鍵關聯了這兩張表,但在實際的開發使用中,咱們但願在查詢到UserAuth實例的時候,但願可以直接就可以獲得對應的用戶信息UserInfo的實例,這時候就能夠用db.relationship()接口。在UserAuth就指定了這個關係

user_basic = db.relationship(UserInfo, backref=db.backref('user_auth', uselist=False))
複製代碼

說明在UserAuth的實體中定義了一個user_basic的字段,當查詢到UserAuth實例時,能夠直接獲得UserInfo的信息,而不須要程序猿再去經過外鍵user_id去數據庫中查詢用戶信息。

db.relationship()中的第一個參數表示要關聯的哪張表,能夠傳類名或表名稱的字符串;第二個參數backref的意思是在UserInfo中也定義一個user_auth的屬性,方便查詢到用戶信息時,能夠經過這個屬性獲得對應的受權信息。uselist=False的意思是user_authuser_info是一對一的關係,若是是一對多的關係,這裏uselist=True,不傳參數時默認uselistTrue

0x03 總結

本文對前面幾講中的涉及到的模型定義中關係的表示和緩存的使用作一個補充說明。

0x04 引用

相關文章
相關標籤/搜索