輕量級Web框架Flask(二)

来源:https://www.cnblogs.com/yetangjian/archive/2023/04/14/17320268.html
-Advertisement-
Play Games

Flask-SQLAlchemy MySQL是免費開源軟體,大家可以自行搜索其官網(https://www.MySQL.com/downloads/) 測試MySQL是否安裝成功 在所有程式中,找到MySQL→MySQL Server 5.6下麵的命令行工具,然後單擊輸入密碼後回車,就可以知道MyS ...


Flask-SQLAlchemy

MySQL是免費開源軟體,大家可以自行搜索其官網(https://www.MySQL.com/downloads/)

測試MySQL是否安裝成功

在所有程式中,找到MySQL→MySQL Server 5.6下麵的命令行工具,然後單擊輸入密碼後回車,就可以知道MySQL資料庫是否鏈接成功。

右擊桌面上的“電腦”,在彈出的快捷鍵菜單中選擇“屬性”|“高級系統設置”|“環境變數”,在path裡面添加MySQL bin目錄的路徑。選擇環境變數,在環境變數中的path路徑下輸入你的MySQL路徑就行了。預設安裝的路徑是C:\MySQL\MySQL Server 5.6\bin

安裝flask-sqlalchemy,安裝不了就更換豆瓣源

pip install flask-sqlalchemy

 對象-關係映射實質

class  Lib_card(db.Model):
    __tablename__ = 'lib_card'
    id = db.Column(db.Integer, primary_key=True, comment='id號')
    card_id = db.Column(db.Integer, nullable=False, comment = '借書證')
    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    books = db.relationship('Book', backref=db.backref('cards'),uselist=False)

在Flask-SQLAlchemy中,插入、修改、刪除操作均由資料庫會話管理

需要一個配置config.py

USERNAME= 'root'                                        #設置登錄賬號
PASSWORD= '930103'                                        #設置登錄密碼
HOST= '127.0.0.1'                                        #設置主機地址
PORT= '3306'                                                #設置埠號
DATABASE= 'demo1'                                #設置訪問的資料庫
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#創建資料庫連接示例
#動態追蹤修改設置,如未設置只會提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO= True

實例

from datetime import datetime

from flask import Flask                                                        #導入Flask模塊
from flask_sqlalchemy import SQLAlchemy               #導入SQLAlchemy模塊
import config                                                                 #導入配置文件
app= Flask(__name__)                                                        #Flask初始化
app.config.from_object(config)                                        #配置文件實例化
#初始化一個對象
db=SQLAlchemy(app)

class Book(db.Model):
    __tablename__ = 'book'
    id = db.Column(db.Integer, primary_key = True,comment='id號')
    title = db.Column(db.String(50), nullable=False,comment='書名')
    publishing_office = db.Column(db.String(100), nullable=False,comment='出版社')
    isbn = db.Column(db.String(100), nullable=False, comment='isbn號')
    storage_time = db.Column(db.DateTime, default=datetime.now(), comment='入庫時間')

class  Lib_card(db.Model):
    __tablename__ = 'lib_card'
    id = db.Column(db.Integer, primary_key=True, comment='id號')
    card_id = db.Column(db.Integer, nullable=False, comment = '借書證')
    book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
    books = db.relationship('Book', backref=db.backref('cards'),uselist=False)

with app.app_context():
#測試資料庫連接是否成功
    db.create_all()     #創建資料庫
    # book1= Book(id=9,title='智能導論', publishing_office='高等教育出版社',isbn='9787040479844')
    # db.session.add(book1)
    # db.session.commit()
    # result = Book.query.filter(Book.id == 9).first()
    # print(result.title)
    # agine = Book.query.filter(Book.title == result.title).all()
    # for i in agine:
    #     print(i.id)
    # db.session.delete(result)
    # db.session.commit()
    # card1=Lib_card(card_id='18001', book_id='8')
    # card2=Lib_card(card_id='18002', book_id='8')
    # db.session.add(card1)
    # db.session.add(card2)
    # db.session.commit()
    book_query = Book.query.filter(Book.id == 9).first()
    lib_card_query = book_query.cards
    for i in lib_card_query:
        print(i.card_id)

@app.route('/')
def index():
    return 'index'

# if __name__== '__main__':
#     app.run(debug=True)

註意:一個表(模型)的定義必須要定義一個主鍵,這個主鍵一般為id。在定義了Lib_card類後,申明瞭一個外鍵,並且在relationship方法中使用uselist=False來約束其關係。book_id =db.Column(db.Integer,db.ForeignKey('book.id'))表示創建一個外鍵,類型要跟主表一樣,通過db.ForeignKey("user.id")與主表綁定books =db.relationship('Book',backref=db.backref('cards');uselist=False)表示Book可以根據Lib_card中的借書證查找到book表中的信息,backref="cards"表示book表可以直接通過cards查找到該書下的借書證號碼。

框架實例

建一個apps文件夾,添加一個admin包,admin包下創建三個py文件

#__init__.py
#預載入模塊內容
#其他地方調用的時候 可以直接from apps.admin import bp as admin_bp不用找到views
from .views import bp
#forms.py
from flask_wtf import FlaskForm
from wtforms import *
from wtforms.validators import *

class NameForm(FlaskForm):
    username = StringField('用戶名',validators=[DataRequired()])
    password = PasswordField('密碼',validators=[DataRequired()])
    submit = SubmitField('提交')
#models.py
from exts import db

class User(db.Model):
    __tablename__ = 'jq_user'
    uid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=False, comment="用戶名")
    password = db.Column(db.String(100), nullable=False,comment="密碼")
    email = db.Column(db.String(50), nullable=False, unique=True, comment = "郵箱")
#views.py
from flask import Blueprint, request, flash, render_template
from apps.admin.forms import NameForm
from apps.admin.models import User

bp = Blueprint("admin",__name__)

@bp.route("/admin",methods=['GET','POST'])
def index():
    form = NameForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            username = request.form.get('username')
            password = request.form.get('password')
            result = User.query.filter(User.username==username).first()
            if result and password == result.password:
                flash('登錄成功')
            else:
                return render_template('login.html', form=form, errormsg="登陸失敗")
    return render_template('login.html', form=form)

建一個文件夾templates,專門放login.html文件,通過render_template調用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <h1>用戶註冊登錄</h1>
    <form method="post" action="/test/admin">
        {{ form.csrf_token()}}
        {{ form.username.label }}{{ form.username}}
        {{ form.password.label }}{{ form.password}}
        {{ form.submit }}{{errormsg}}

        {% for message in get_flashed_messages() %}
            {{ message }}
        {% endfor %}
    </form>
</head>
<body>

</body>
</html>

建一個app.py

from flask import Flask
from apps.admin import bp as admin_bp
from exts import db
from apps.common import bp as common_bp
from apps.front import bp as front_bp
from apps.admin.models import User
from apps.common.models import Book


def create_app():
    app = Flask(__name__)
    app.secret_key = '123321'
    #註冊藍圖,註冊時候可以設置首碼
    app.register_blueprint(admin_bp,url_prefix="/test")
    app.register_blueprint(common_bp)
    app.register_blueprint(front_bp)
    app.config.from_object('config')
    # db.app = app
    db.init_app(app)
    return app



if __name__ == '__main__':
    app = create_app()
    with app.app_context():
        db.create_all()
    app.run(host="127.0.0.1",port=1314,debug=True)

建一個config.py

DEBUG=True
USERNAME= 'root'                                        #設置登錄賬號
PASSWORD= '930103'                                        #設置登錄密碼
HOST= '127.0.0.1'                                        #設置主機地址
PORT= '3306'                                                #設置埠號
DATABASE= 'demo1'                                #設置訪問的資料庫
SQLALCHEMY_DATABASE_URI= f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'#創建資料庫連接示例
#動態追蹤修改設置,如未設置只會提示警告
SQLALCHEMY_TRACK_MODIFICATIONS=False
#查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO= True

建一個exts.py

#encoding:utf-8
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()

作者: yetangjian

出處: https://www.cnblogs.com/yetangjian/p/17320268.html

關於作者: yetangjian

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出, 原文鏈接 如有問題, 可郵件([email protected])咨詢.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新媒體時代,廣告樣式越來越豐富。相較於傳統的圖文信息,視頻類廣告更具有直觀性,能夠讓消費者在瞭解產品知識和功能的同時加深對產品的印象。 因此在各類網站或App上投放視頻類廣告是個很好的宣傳方式,但廣告商們如果想在網站上展示視頻廣告,必須確保視頻廣告投放協議與發佈渠道的播放器相容;如果不能相容,廣告商 ...
  • “我苦心鍛煉了三年,我變禿了,也變強了。” —— 琦玉老師 0x00 大綱 0x01 前言 四個月前,我在《你是來找茬的吧?對自己的博客進行調優》一文中探討了以博客的使用者而不是開發者身份去進行優化,究竟能做到何種程度的問題。當時以 Edge 瀏覽器的開發者工具里的 lighthouse 評分和載入 ...
  • 有一朋友想把網頁內容變成PDF下載下來。問我有沒有好辦法。 這還真巧了,咱公司也有這個需求,就是網頁生成合同,然後可以直接列印合同內容。最早吧,就是可以直接列印就好了。 當時為解決完美列印的問題,挺費勁的,當時第三方插件還有BUG(當然把解決放給發給作者了,作者早已經修複了),正經反覆折騰了好一陣子 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Vue.js是一個基於組件化和響應式數據流的前端框架。當我們在Vue中編寫模板代碼時,它會被Vue編譯器處理並轉換為可被瀏覽器解析的JavaScript代碼。Vue中的模板實際上是HTML標記和Vue指令的組合,它們會被Vue編譯器處理並 ...
  • <!-- 封裝的模板下載和導入按鈕和功能組件--> <template> <span style="margin-left: 10px"> <el-button size="mini" class="el-icon-download" @click="downFiles"> 下載模板</el-but ...
  • 前言 前端開發者若要進行後端開發,大多都會選擇node.js,在node生態下是有大量框架的,其中最受新手喜愛的便是老牌的express.js,接下來我們就從零創建一個express項目。 安裝node 在這裡:https://nodejs.org/dist/v16.14.0/node-v16.14 ...
  • 作者羅錦華,API7.ai 技術專家/技術工程師,開源項目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者。 原文鏈接 為什麼需要 Lua 動態調試插件? Apache APISIX 有很多 Lua 代碼,如何在運行時不觸碰源代碼的情況下,檢查代碼裡面的變數值? ...
  • 和女朋友坐一塊的時候,突然想到了,哈哈哈哈哈 不會很難!!! import java.util.*; import java.lang.Math; // 註意類名必須為 Main, 不要有任何 package xxx 信息 public class Main { public static void ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...