Flask WTForms 表單插件的使用

来源:https://www.cnblogs.com/LyShark/archive/2023/11/26/17857906.html
-Advertisement-
Play Games

在Web應用中,表單處理是一個基本而常見的任務。Python的WTForms庫通過提供表單的結構、驗證和渲染等功能,簡化了表單的處理流程。與此同時,Flask的擴展Flask-WTF更進一步地整合了WTForms,為開發者提供了更便捷、靈活的表單處理方式。Flask-WTF是建立在WTForms之上... ...


在Web應用中,表單處理是一個基本而常見的任務。Python的WTForms庫通過提供表單的結構、驗證和渲染等功能,簡化了表單的處理流程。與此同時,Flask的擴展Flask-WTF更進一步地整合了WTForms,為開發者提供了更便捷、靈活的表單處理方式。Flask-WTF是建立在WTForms之上的Flask擴展,旨在簡化Web應用中表單處理的流程。它提供了與Flask框架的無縫集成,使得表單的創建、驗證和渲染變得非常容易。通過Flask-WTF,開發者能夠輕鬆地構建具有強大功能和良好用戶體驗的表單頁面。

主要特點:

  1. 結合WTForms功能: Flask-WTF基於WTForms庫,繼承了WTForms的強大功能,包括表單欄位、驗證器等,為開發者提供了一套完備的表單處理工具。
  2. Flask集成: 與Flask框架無縫集成,通過簡單的導入和初始化,即可在Flask應用中使用Flask-WTF提供的表單處理功能。
  3. CSRF保護: Flask-WTF內置了CSRF(Cross-Site Request Forgery)保護機制,幫助開發者防範Web應用中的CSRF攻擊。
  4. 表單渲染: 提供了方便的表單渲染方法,使得表單的呈現過程更為簡單,開發者可以輕鬆定製表單的外觀。
  5. 文件上傳支持: 支持文件上傳功能,使得開發者能夠方便地處理包含文件上傳功能的表單。

通過Flask-WTF,開發者能夠以更高效的方式處理Web應用中的表單,減少重覆性工作,提升開發效率。

簡單驗證表單

前臺定義渲染模板,後端對模板渲染,並根據validators驗證器中的規則對輸入內容進行匹配。

<form method="post">
  {{ form.csrf_token }}
  <!--可自定義增加顏色-->
  <p>{{ form.username.label(style="color:red;") }} : {{form.username}}</p>
  <p>{{ form.password.label }} : {{form.password}}</p>
  <p>{{ form.repeat_password.label }} : {{form.repeat_password}}</p>

  {% for msg in form.repeat_password.errors %}
    <p>提示: {{msg}}</p>
  {% endfor %}

  {{form.submit}}
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexp

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):
    # DataRequired 驗證不為空,Length 限制長度, Regexp限制不允許出現弱口令
    username = StringField(label=u"登錄賬號", validators=[DataRequired(), Length(min=6, max=18)])
    password = PasswordField(label=u"登錄密碼", validators=[DataRequired(), Length(min=6, max=18)])
    repeat_password = PasswordField(label=u"確認密碼", validators=[DataRequired(),EqualTo("password", u"兩次密碼不一致")])
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            username = form.username.data
            password = form.password.data
            repeat_password = form.repeat_password.data

            print("用戶名: {} --> 密碼: {}".format(username,repeat_password))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

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

運行後預設構造一個賬號密碼登錄視窗的表單,用戶可以填寫表單並返回給後臺信息,如下圖所示;

表單附加參數

所謂附加參數就是指,渲染器返回頁面是主動對某個組件增加一些CSS屬性,這些屬性起到裝飾作用,通常會使用render_kw屬性返回CSS。

{% for msg in get_flashed_messages() %}
    <p>閃現消息: {{ msg }}</p>
{% endfor %}

<form method="POST" id="form-data">
    {{ form.csrf_token }}
    {{ form.username.label }} : {{ form.username }}
    {{ form.password.label }} : {{ form.password }}
    {{ form.submit.label }} {{ form.submit }}
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request,flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo,Length,Regexp

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):
    username = StringField(
        # 標簽
        label="賬號",
        # 驗證器
        validators=[
            DataRequired('請輸入用戶名')
        ],
        description="賬號",
        # 增加附加參數
        render_kw={
            "class":"form-control",
            "placeholder":"請輸入用戶名",
            "required":'required'
        }
    )

    password = PasswordField(
        label="密碼",
        validators=[
            DataRequired('請輸入登錄密碼')
        ],
        description="密碼",
        render_kw={
            "class": "form-control",
            "placeholder": "請輸入登錄密碼",
            "required": 'required'
        }
    )
    submit = SubmitField(
        label="登錄",
        render_kw={
            "class": "btn",
        }
    )

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            username = form.username.data
            password = form.password.data
            print("用戶名: {} 密碼: {}".format(username, password))

            if username == "lyshark" and password == "123123":
                flash("密碼正確")
            else:
                flash("密碼錯誤")

    return render_template("index.html", form=form)

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

運行上述代碼,當用戶輸入密碼錯誤後會出現閃現消息,如下圖所示;

地址驗證表單

Flask框架中特殊表單的驗證有很多,常用的表單驗證也就以下這幾種。

<form method="post">
  {{ form.csrf_token }}

  <p>{{ form.url.label }} : {{form.url}}</p>
    <p>{{ form.address_v4.label }} : {{form.address_v4}}</p>
    <p>{{ form.address_v6.label }} : {{form.address_v6}}</p>
    <p>{{ form.mac.label }} : {{form.mac}}</p>
  {{form.submit}}
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm

from wtforms import (BooleanField, DecimalField, DateField, DateTimeField, FieldList,
 FloatField, FormField, IntegerField, RadioField, SelectField,
 SelectMultipleField, StringField,SubmitField,PasswordField)

from wtforms.validators import (DataRequired, data_required, Email, email, EqualTo, equal_to,
    IPAddress, ip_address, InputRequired, input_required, Length,
    length, NumberRange, number_range, Optional, optional,
    Regexp, regexp, URL, url, AnyOf,
    any_of, NoneOf, none_of, MacAddress, mac_address, UUID)

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):
    url = StringField(label=u"驗證網址", validators=[DataRequired(), Length(min=6, max=30),URL()])
    address_v4 = StringField(label=u"驗證IPv4", validators=[DataRequired(), Length(max=30), IPAddress()])
    address_v6 = StringField(label=u"驗證IPv6", validators=[DataRequired(), Length(max=30), IPAddress(ipv6=True)])
    mac = StringField(label=u"驗證MAC地址",validators=[DataRequired(), Length(max=60), MacAddress()])
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            url = form.url.data
            address_v4 = form.address_v4.data
            address_v6 = form.address_v6.data
            mac = form.mac.data

            print("網址: {} 地址v4: {} 地址v6: {} MAC地址: {}".format(url,address_v4,address_v6,mac))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

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

網路IP地址的驗證也有相應的表單,如下表單分別可以實現對不同地址的驗證;

特殊表單驗證

WTF表單除去常規表單驗證以外,還可以驗證其他特殊表單,例如驗證郵箱,浮點數,日期時間等。

<form method="post">
    {{ form.csrf_token }}

    <!--郵箱-->
    <p>{{ form.email.label }} --> {{ form.email }}</p>
    {% for msg in form.email.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--年齡-->
    <p>{{ form.age.label }} --> {{ form.age }}</p>
    {% for msg in form.age.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--小數-->
    <p>{{ form.height.label }} --> {{ form.height }}</p>
    {% for msg in form.height.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--浮點數-->
    <p>{{ form.float_.label }} --> {{ form.float_ }}</p>
    {% for msg in form.float_.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--段落-->
    <p>{{ form.description.label }} --> {{ form.description }}</p>
    {% for msg in form.description.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--日期-->
    <p>{{ form.local_date.label }} --> {{ form.local_date }}</p>
    {% for msg in form.local_date.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--時間-->
    <p>{{ form.time_date.label }} --> {{ form.time_date }}</p>
    {% for msg in form.time_date.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--日期時間-->
    <p>{{ form.datetime_date.label }} --> {{ form.datetime_date }}</p>
    {% for msg in form.datetime_date.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    {{form.submit}}
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,
                            SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,
                            RadioField, IntegerField, DecimalField, SubmitField,
                            IntegerRangeField)

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):
    # 安裝 pip install email-validator
    email = StringField(label=u"郵箱地址", validators=[Email(message=u"郵箱格式錯誤"),Length(max=32)])

    # 整數類型輸入,必須輸入整型數值,範圍在16到70之間
    age = IntegerField(label=u"年齡", validators=[NumberRange(min=16, max=70)])

    # 小數類型輸入,必須輸入數字數值,顯示時保留兩位小數
    height = DecimalField(label=u"小數輸入", places=2)

    # 浮點數類型輸入,必須輸入浮點數值
    float_ = FloatField(label=u"浮點數輸入")

    # Text Area類型 段落輸入框
    description = TextAreaField(label=u"段落輸入")

    # 日期類型輸入,必須輸入是 "年-月-日" 格式的日期
    local_date = DateField(label=u"日期", format='%Y-%m-%d')

    # 時間類型輸入,必須輸入是 "時:分:秒" 格式
    time_date = TimeField(label=u"時間", format='%H:%M')

    # 日期時間類型,必須輸入是 "年-月-日 時:分:秒" 格式
    datetime_date = DateTimeField(label=u"日期時間", format='%Y-%m-%d %H:%M:%S')
    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            email = form.email.data
            age = form.age.data
            height = form.height.data
            float_ = form.float_.data
            description = form.description.data
            print("郵箱: {} 年齡: {} 小數點: {} 浮點數: {} 段落輸入: {}".format(email,age,height,float_,description))

            local_date = form.local_date.data
            time_date = form.time_date.data
            datetime_date = form.datetime_date.data
            print("日期: {} 時間: {} 日期時間: {}".format(local_date,time_date,datetime_date))
            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

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

特殊表單的構建,這裡的表單包括瞭如下圖所示的欄位可以使用;

覆選多選表單

覆選框多選框與下拉選擇框三種表單的驗證方式總結。

<form method="post">
    {{ form.csrf_token }}

    <!--單選框過濾器-->
    <p>{{ form.gender.label }} {{ form.gender }}</p>
    {% for msg in form.gender.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--下拉框過濾器-->
    <p>{{ form.jobs.label }} {{ form.jobs }}</p>
    {% for msg in form.jobs.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--多選框過濾器-->
    <p>{{ form.hobby.label }} {{ form.hobby }}</p>
    {% for msg in form.hobby.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--單選框過濾器-->
    <p>{{ form.accept.label }} {{ form.accept }}</p>
    {% for msg in form.accept.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    <!--覆選框過濾器-->
    <p>{{ form.favor.label }} {{ form.favor }}</p>
    {% for msg in form.favor.errors %}
        <p>錯誤提示: {{msg}}</p>
    {% endfor %}

    {{form.submit}}
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import Form,widgets,validators
from wtforms.fields import simple,core
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,
                            SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,
                            RadioField, IntegerField, DecimalField, SubmitField,
                            IntegerRangeField)

from wtforms.fields import simple,core

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):

    # RadioBox單選框,choices里的內容會在ul標簽里,裡面每個項是(值,顯示名)對
    gender = RadioField(label=u"性別", choices=[('man', '男'), ('wo', '女')], validators=[DataRequired()])

    # Select下拉單選框,choices里的內容會在Option里,裡面每個項是(值,顯示名)對
    jobs = SelectField(label=u"工作", choices=[("teacher","老師"),("doctor","醫生"),("engineer","工程師")])

    # Select多選框,choices里的內容會在Option里,裡面每個項是(值,顯示名)對
    hobby = SelectMultipleField(label=u"興趣", choices=[('swim', '滲透'),('skate', '運維'),('hike', '科學')])

    # Checkbox單選框 加上default='checked' 即預設是選上的
    accept = BooleanField(label=u"單選框", default='checked', validators=[DataRequired()])

    # Select覆選框, 多選框合併選擇,覆選框
    favor = SelectMultipleField(
        label="特長",
        choices=((1, 'Python'), (2, '滲透'), (3, "運維"), (4, "科學")),
        coerce=int, default=[1, 2, 4],
        option_widget=widgets.CheckboxInput(),
        widget=widgets.ListWidget(prefix_label=False)
    )

    submit = SubmitField(label=u"提交")

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            gender = form.gender.data
            jobs = form.jobs.data
            hobby = form.hobby.data
            accept = form.accept.data
            favor = form.favor.data

            print("性別: {} 工作: {} 興趣: {} 是否接受: {} 覆選框: {}".format(gender,jobs,hobby,accept,favor))


            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

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

選擇菜單包括了單選與多選,如下圖所示的表單均可以構建;

文件上傳表單

文件上傳Flask也提供了預設表單可以使用,如下提供的FileField即可完成上傳工作。

<form method="POST" action="" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    {{ form.attach.label }} {{ form.attach }}
    <input type="submit" value="Submit">
</form>

後臺定義MyFlaskForm(FlaskForm)類用於對登錄表單進行動態渲染。

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from werkzeug.utils import secure_filename
from flask_wtf.file import FileField, FileAllowed, FileRequired

app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# 定義表單模型類
class MyFlaskForm(FlaskForm):
    attach = FileField(label="上傳文件",validators=[
        FileRequired(),
        FileAllowed(["jpg","png"],"只可上傳圖片")
    ])

@app.route("/", methods=["GET", "POST"])
def index():
    form = MyFlaskForm()

    if request.method == "POST":
        if form.validate_on_submit():
            filename = secure_filename(form.attach.data.filename)
            form.attach.data.save('/' + filename)
            return 'Upload successfully!'


            return render_template("index.html", form=form)

    return render_template("index.html", form=form)

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

上傳表單時需要註意,啟動的進程必須具備管理員許可權或者是讀寫許可權,否則則會提示許可權拒絕;

文章出處:https://www.cnblogs.com/LyShark/p/17857906.html
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL JOIN JOIN子句用於基於它們之間的相關列合併來自兩個或更多表的行。 讓我們看一下“Orders”表的一部分選擇: OrderID CustomerID OrderDate 10308 2 1996-09-18 10309 37 1996-09-19 10310 77 1996-09-2 ...
  • 好基友扔過來一張效果圖,簡單分析下,一起看看如何實現它吧。 一個半環形用於表示 0 - 100%。 半環形開頭有一個圓點作為修飾。 半環形兩端需要呈現為圓角。 通過 div 實現 先畫一個長方形。 <div class="graph"></div> .graph { width: 200px; he ...
  • 這是一本比較冷門的書《設計規則:模塊化的力量》,雖然豆瓣上只有58個評價,但是確實能學到很多東西。 這本書對我非常深遠。不是是投資,創業,還是其他領域,模塊化思想都能幫上你。這本書告訴我們生萬物的規則。 書籍電子版PDF(建議及時保存,避免被和諧):https://pan.quark.cn/s/aa ...
  • 如果在IT行業的時間夠長的話,可能還記得大約10幾年前,設計模式風靡一時的時候,有過一段反 "if" 的運動。 所謂的反"if"運動,其實是誇大了"if"語句帶來的問題,比如當時提出的問題有: 代碼不好維護,特別是if或者else中的代碼比較多的時候 if和 else if分支太多的時候,代碼難以閱 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記四十三之使用uWSGI部署Django系統 目前部署 Django 的方式一般來說是使用 Nginx + uWSGI + Django 來實現。 處理流程是,當一個請求發送過來會先經過 Nginx,如果是靜態文件請求,Nginx 這一層直 ...
  • 在導入包方面,兩者都使用import語句,但是Python沒有類路徑的概念,直接使用文件名來導入模塊。我們還討論了自定義模塊的創建和使用,以及在不同目錄下如何組織代碼結構。此外,我們介紹了一些常用的Python模塊,包括time、datetime、json、os和sys,它們在開發中非常實用。希望今... ...
  • 前言 玩SpringCloud之前最好懂SpringBoot,別搞撐死駱駝的事。Servlet整一下變成Spring;SSM封裝、加入東西就變為SpringBoot;SpringBoot再封裝、加入東西就變為SpringCloud 架構的演進 單體應用架構 單體架構:表示層、業務邏輯層和數據訪問層即 ...
  • 在今天的課上,我們深入討論了封裝、反射和單例模式這幾個重要的概念。我不想過多地贅述它們的細節,但是請大家務必記住它們的基本語法規則,因為這也是面向對象章節的結束。我希望大家能夠牢牢掌握這些知識點,為未來的學習打下堅實的基礎。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...