最近在回看之前做的2個flask框架寫的項目代碼,因為自己主要負責業務邏輯的API那一塊,沒有整個框架從頭到尾實踐一遍,借這次回看,寫一個很簡單的小項目並記錄下來,作為自己對flask框架理解思路的梳理和筆記的歸納。
1.前期准備
下載安裝python(我個人的習慣是用python3)和mysql數據庫。
2.目錄結構的制定
首先flask框架是沒有固定的項目目錄組織結構的,所以我們自己制定出自己風格習慣的目錄結構。根據需要存放的文件類型,先簡單的定為以下幾個目錄:
3.代碼編寫
3.1從apps\__init__.py里入手,創建一個flask實例,並對其進行屬性參數的設置:
# -*-coding:utf8-*- from flask import Flask import os from datetime import timedelta from .app_login.views import login_blue from .app_manager.views import manager_blue def create_app(): app = Flask(__name__) # 創建flask實例 app.register_blueprint(login_blue) # 注冊藍圖(路由) app.register_blueprint(manager_blue) app.config.update(SECRET_KEY=os.urandom(24)) # 設置密鑰 app.permanent_session_lifetime = timedelta(minutes=24*60) return app # 返回設置完參數的flask實例
3.2運行入口:run.py,運行flask實例。
# -*-coding:utf8-*- from apps import create_app from conf import conf app = create_app() # 獲取flask實例 if __name__ == '__main__': # 啟動服務;是否開啟調試模式、監聽IP和端口在conf.py里設置 app.run(debug=conf.DEBUG, port=conf.PORT, host=conf.HOST)
3.3配置參數:conf.py。根據生產、測試、開發三種環境設置不同參數,具體的參數值根據自己安裝mysql時設定的來填寫。
# -*-coding:utf8-*- import os class Config(object): DEBUG = True # flask是否開啟debug模式 DB_NAME = 'danni' # 數據庫名稱 DB_HOST = '127.0.0.1' # 數據庫IP DB_PORT = 3306 # 數據庫端口(mysql默認為:3306) DB_UN = '' # 數據庫賬號名 DB_PW = '' # 數據庫密碼 class ProductionConfig(Config): """ 生產環境 """ DEBUG = False # flask是否開啟debug模式 class TestingConfig(Config): """ 測試環境 """ DB_HOST = '127.0.0.1' # 數據庫IP地址 R_HOST = '127.0.0.1' # Redis IP地址 class DevelopConfig(Config): """ 開發環境 """ PORT = 8082 # flask端口;flask默認監聽本地127.0.0.1:5000 HOST = '0.0.0.0' # flask綁定ip;0.0.0.0表示監聽所有地址 # 自動判斷環境生產config if os.path.exists('production.conf'): conf = ProductionConfig() conf_ver = 'conf.ProductionConfig' conf_env = u'生產環境' elif os.path.exists('test.conf'): conf = TestingConfig() conf_ver = 'conf.TestingConfig' conf_env = u'測試環境' else: conf = DevelopConfig() conf_ver = 'conf.DevelopConfig' conf_env = u'開發環境'
3.4數據庫連接的參數設置:libs\db.py
# -*-coding:utf8-*- import pymysql from conf import conf # 連接數據庫 db = pymysql.connect(host=conf.DB_HOST, port=conf.DB_PORT, user=conf.DB_UN, passwd=conf.DB_PW, db=conf.DB_NAME) # 建立游標 cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 返回{}或[{}, {}, ...] # cursor = db.cursor() # 返回()或((), (), ...)
3.5設置完這些參數后,進入業務邏輯代碼:apps\app_manager;分為3部分:__init__.py負責初始化變量等,model.py負責數據庫數據處理等,views.py負責不同api接口的邏輯;業務場景:現有一個girls表,控制台端要獲取表內所有用戶的信息。
danni數據庫下girls表的信息(name字段值不能重復):
model.py:數據庫的數據操作
# -*-coding:utf8-*- from libs.db import db import datetime import pymysql # 根據用戶名user獲取對應的用戶信息;如果user為空,則獲取所有用戶信息 def get_users(user): sql = 'select * from girls where status != 1001' if user: sql += ' and name = %a' % user # 數據庫的連接參數在libs/db.py設置 cursor = db.cursor(cursor=pymysql.cursors.DictCursor) # 返回{}或[{}, {}, ...] cursor.execute(sql) users = cursor.fetchall() cursor.close() # 記得要關閉 return users
views.py里獲取前端傳來的數據,根據查詢參數和業務邏輯調用model.py里函數
# -*-coding:utf8-*- from flask import Blueprint, render_template, request, jsonify from .model import get_users, insert_user # 聲明一個藍圖;設置了藍圖名稱、靜態文件和模板文件存放的路徑及url前綴 manager_blue = Blueprint('manager', __name__, template_folder='../../template', static_folder='../../static', url_prefix='/manager') # 將url和視圖函數綁定 # 獲取所有會員信息 @manager_blue.route('/getuser', methods=['post']) # 定義url和請求方法:post def get_user(): data = request.form # 獲取前端數據 user = data['user'] users = get_users(user) # 調用model.py里get_users() return jsonify({"code": 200, "msg": "success", "data": users})
4.啟動服務:即運行run.py:python3 run.py;
根據提示的ip和端口加上自己定義路由訪問該地址:http://139.224.10.202:8082/manager/getuser
返回的結果:
5.結尾
到這里就是一個完整的框架流程了,但是還有前端模板渲染、get訪問、sql語句遇到的坑等在這里沒有提到,可以參考完整的項目代碼(也是很簡單的,比較好理解)。