Python flask項(xiàng)目入門(mén)教程
一、flask對(duì)于簡(jiǎn)單搭建一個(gè)基于python語(yǔ)言-的web項(xiàng)目非常簡(jiǎn)單
二、項(xiàng)目目錄
示例代碼 git路徑

三、代碼介紹
1、安裝pip依賴(lài)
通過(guò)pip插入數(shù)據(jù)驅(qū)動(dòng)依賴(lài)pip install flask-sqlalchemy 和 pip install pymysql
2.配置數(shù)據(jù)源 config.py
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = '123456'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'tgcrm'
# mysql 不會(huì)認(rèn)識(shí)utf-8,而需要直接寫(xiě)成utf8
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
# 加載密鑰
key_access = '&^_^&protect*py_&^_^&'3、引用orm框架 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)
/mapper/exts.py
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
4、啟動(dòng)文件 app.py
from flask import Flask
# 引用數(shù)據(jù)庫(kù)啟動(dòng)文件
from mapper.exts import db
# 引用數(shù)據(jù)庫(kù)配置文件
import config
# 引用數(shù)據(jù)庫(kù)
from controller.user_controller import *
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
app.register_blueprint(user, url_prefix="/user")
# 全局?jǐn)r截器校驗(yàn)token
@app.before_request
def before():
key = str(request.headers.get('TOKEN'))
if key != format(config.key_access):
return 'Password error'
else:
pass
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8060)5、數(shù)據(jù)庫(kù)操作
通過(guò)Flask提供orm框架對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作
5.1增加
# 添加 http://127.0.0.1:5000/user/add/2/1
@user.route('/add/<username>/<pwd>')
def add_user(username, pwd):
print(username, pwd)
userinfo = User(username=username, pwd=pwd)
db.session.add(userinfo)
db.session.commit()
# # 接受前端發(fā)來(lái)的數(shù)據(jù)
# data = json.loads(request.form.get('data'))
#
# # lesson: "Operation System"
# # score: 100
# lesson = data["lesson"]
# score = data["score"]
#
# # 自己在本地組裝成Json格式,用到了flask的jsonify方法
# info = dict()
# info['name'] = "pengshuang"
# info['lesson'] = lesson
# info['score'] = score
# return jsonify(info)
return jsonify("ADD_SUCCESS")5.2刪除
@user.route('/delete/<int:id>')
def delete_user(id):
print(id)
# 第一種
user1 = User.query.filter().first()
print(user1.id)
db.session.delete(user1)
db.session.commit()
# 第二種
user2 = User.query.filter(User.id == 2).delete()
db.session.commit()
return jsonify("DELETE_SUCCESS")5.3修改
@user.route('/update/<int:id>')
def update_user(id):
user1 = User.query.filter(User.id == id).first()
user1.username = "我是修改后的"
db.session.merge(user1)
db.session.commit()
return jsonify("UPDATE_SUCCESS")5.4查詢(xún)
@user.route('/list')
def list_users():
users = User.query.all()
print(users)
users_output = []
for user in users:
users_output.append(user.to_json())
return jsonify(users_output)5.5條件查詢(xún)
1.filter_by和filter
兩種寫(xiě)法根據(jù)版本的不同:
filter_by: 用于查詢(xún)簡(jiǎn)單的列名,不支持比較運(yùn)算符
filter比filter_by的功能更強(qiáng)大,支持比較運(yùn)算符,支持or_、in_等語(yǔ)法。
data = UserInfo.query.filter(UserInfo.name=='1').all()
data = UserInfo.query.filter_by(name='1').all()
1. 根據(jù)用戶(hù)名查詢(xún)符合條件的第一條數(shù)據(jù)
User.query.filter_by(username=username).first()
print("查詢(xún)1:", user1.to_json())
2. 查詢(xún)名字結(jié)尾字符為g的所有數(shù)據(jù)[開(kāi)始/包含]
User.query.filter(User.username.endswith('g')).all()
User.query.filter(User.username.contains('g')).all()
?
3. 查詢(xún)名字不等于wang的所有數(shù)據(jù)[2種方式]
from sqlalchemy import not_
注意了?。哼壿嫴樵?xún)的格式:邏輯符_(類(lèi)屬性其他的一些判斷)
User.query.filter(not_(User.username=='yang')).all()
User.query.filter(User.username!='yang').all()
?
4. 查詢(xún)名字和郵箱都以 li 開(kāi)頭的所有數(shù)據(jù)[2種方式]
from sqlalchemy import and_
User.query.filter(and_(User.username.startswith('li'), User.email.startswith('li'))).all()
User.query.filter(User.username.startswith('li'), User.email.startswith('li')).all()
?
5. 查詢(xún)password是 `123456` 或者 `email` 以 `itheima.com` 結(jié)尾的所有數(shù)據(jù)
from sqlalchemy import or_
User.query.filter(or_(User.pwd=='123456', User.email.endswith('tiantian.com'))).all()
?
6. 查詢(xún)id為 [1, 3, 5, 7, 9] 的用戶(hù)列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
?
7. 查詢(xún)name為liu的角色數(shù)據(jù) 關(guān)系引用
# 舉例 暫時(shí)沒(méi)有
User.query.filter_by(username='liu').first().role.name
?
8.獲取第一條記錄
User.query.first()
————————————————
版權(quán)聲明:本文為CSDN博主「無(wú)敵小田田」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36602951/article/details/132123744
6、分頁(yè)對(duì)象
- has_prev/has_next——是否有上一頁(yè)/下一頁(yè)
- Items——當(dāng)前頁(yè)的數(shù)據(jù)列表
- prev_num/next_num——上一頁(yè)/下一頁(yè)的頁(yè)碼
- total——總記錄數(shù)
- pages——總頁(yè)數(shù)
@user.route('/loadUserPage/<int:page>/<int:per_page>')
def list_user(page, per_page):
""" 用戶(hù)分頁(yè) """
# 每一頁(yè)的數(shù)據(jù)大小-per_page 頁(yè)碼-page
# 1. 查詢(xún)用戶(hù)信息
user = User.query
# 2. 準(zhǔn)備分頁(yè)的數(shù)據(jù)
print(page, per_page)
user_page_data = user.paginate(page, per_page=per_page)
users_output = []
for user in user_page_data.items:
users_output.append(user.to_json())
print("當(dāng)前頁(yè)的數(shù)據(jù)列表", users_output)
print("是否有上一頁(yè)", user_page_data.has_prev)
print("是否下一頁(yè)", user_page_data.has_next)
print("上一頁(yè)的頁(yè)碼", user_page_data.prev_num)
print("下一頁(yè)的頁(yè)碼", user_page_data.next_num)
print("總記錄數(shù)", user_page_data.total)
print("總頁(yè)數(shù)", user_page_data.pages)
return jsonify(users_output)
""" 輸出
當(dāng)前頁(yè)的數(shù)據(jù)列表 [{'pwd': '2', 'id': 2, 'username': '2', 'nick': '2'}]
是否有上一頁(yè) True
是否下一頁(yè) True
上一頁(yè)的頁(yè)碼 1
下一頁(yè)的頁(yè)碼 3
總記錄數(shù) 7
總頁(yè)數(shù) 7
"""四、多模塊配置 藍(lán)圖blueprint
在app項(xiàng)目中引用,可以在app中聲明多個(gè)路徑 /user、/admin 、/customer等等
from controller.user_controller import user app = Flask(__name__) app.config.from_object(config) db.init_app(app) app.register_blueprint(user, url_prefix="/user")
在子應(yīng)用中聲明 controller/user_controller
from flask import Blueprint, jsonify, request, json
user = Blueprint('user', __name__)
# 查詢(xún)?nèi)?http://127.0.0.1:5000/user/list
@user.route('/list')
def list_users():
users = User.query.all()
print(users)
users_output = []
for user in users:
users_output.append(user.to_json())
return jsonify(users_output)五、統(tǒng)一過(guò)濾器
在app.py文件加入前置過(guò)濾器
# 引用配置文件
import config
# 全局?jǐn)r截器校驗(yàn)token
@app.before_request
def before():
key = str(request.headers.get('TOKEN'))
if key != format(config.key_access):
return 'Password error'
else:
pass配置文件包括
# 加載密鑰 key_access = '&^_^&protect*py_&^_^&'
此時(shí)通過(guò)postman訪(fǎng)問(wèn)接口,會(huì)對(duì)header進(jìn)行請(qǐng)求頭校驗(yàn),不滿(mǎn)足請(qǐng)求直接被打回

直接當(dāng)攜帶了TOKEN=xxxx才可以正常訪(fǎng)問(wèn)該接口

到此這篇關(guān)于Python flask項(xiàng)目入門(mén)的文章就介紹到這了,更多相關(guān)Python flask入門(mén)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使paramiko庫(kù)執(zhí)行命令時(shí)在給定的時(shí)間強(qiáng)制退出功能的實(shí)現(xiàn)
這篇文章主要介紹了使paramiko庫(kù)執(zhí)行命令時(shí),在給定的時(shí)間強(qiáng)制退出,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Python 數(shù)據(jù)結(jié)構(gòu)之堆棧實(shí)例代碼
這篇文章主要介紹了Python 數(shù)據(jù)結(jié)構(gòu)之堆棧實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
使用Python進(jìn)行文件讀寫(xiě)操作的基本方法
今天的內(nèi)容來(lái)介紹 Python 中進(jìn)行文件讀寫(xiě)操作的方法,這在學(xué)習(xí) Python 時(shí)是必不可少的技術(shù)點(diǎn),希望可以幫助到正在學(xué)習(xí) python的小伙伴,以下是 Python 中進(jìn)行文件讀寫(xiě)操作的基本方法,需要的朋友可以參考下2025-01-01
樹(shù)莓派采用socket方式文件傳輸(python)
這篇文章主要為大家詳細(xì)介紹了樹(shù)莓派采用socket方式文件傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Python中高級(jí)文本模式匹配與查找技術(shù)指南
文本處理是編程世界的永恒主題,而模式匹配則是文本處理的基石,本文將深度剖析Python Cookbook中的核心匹配技術(shù),并結(jié)合實(shí)際工程案例展示其應(yīng)用,希望對(duì)大家有所幫助2025-08-08
Python查找最長(zhǎng)不包含重復(fù)字符的子字符串算法示例
這篇文章主要介紹了Python查找最長(zhǎng)不包含重復(fù)字符的子字符串算法,涉及Python字符串遍歷、統(tǒng)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
Python實(shí)現(xiàn)的北京積分落戶(hù)數(shù)據(jù)分析示例
這篇文章主要介紹了Python實(shí)現(xiàn)的北京積分落戶(hù)數(shù)據(jù)分析,結(jié)合實(shí)例形式分析了Python針對(duì)北京積分落戶(hù)數(shù)據(jù)的分析、運(yùn)算、展示等相關(guān)操作技巧,需要的朋友可以參考下2020-03-03
詳解小白之KMP算法及python實(shí)現(xiàn)
在看子串匹配問(wèn)題的時(shí)候,書(shū)上的關(guān)于KMP的算法的介紹總是理解不了??戳艘槐榇a總是很快的忘掉,后來(lái)決定好好分解一下KMP算法,算是給自己加深印象。感興趣的朋友跟隨小編一起看看吧2019-04-04

