物事開発の簡単なシミュレーションをフラスコ

フラスコシミュレーション開発フレームワーク

物事の背景

まず、プロファイルリンクMySQLデータベース

# -*- coding:utf8 -*-
import os

debug = True

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'Lora_Model'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI

SQLALCHEMY_TRACK_MODIFICATIONS = False

SECRET_KEY = os.urandom(24)

マスターガイドパケットファイル、オブジェクトをインスタンス化

# -*- coding:utf8 -*-
from flask import Flask, render_template, session, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from flask_login import LoginManager
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo, ValidationError
from datetime import datetime
from Server import config

app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
login_manager = LoginManager(app)

 データベースモデルを作成します。

class User(db.Model):
    __tablename__ = "User"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
    Username = db.Column(db.String(30), nullable=False)
    telephone = db.Column(db.String(20), nullable=False)
    password = db.Column(db.String(30), nullable=False)


class Device(db.Model):
    __tabelname__ = 'Device'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
    title = db.Column(db.String(10), nullable=False)
    value = db.Column(db.String(10), nullable=False)
    state = db.Column(db.String(10), nullable=False)
    time = db.Column(db.DateTime, default=datetime.now())

フォームクラスを作成します。

class LoginForm(FlaskForm):
    Username = StringField(label=u'用户名', validators=[DataRequired(u"用户名不能为空")])
    password = PasswordField(label=u'密码', validators=[DataRequired(u"密码不能为空")])
    submit = SubmitField(label=u'登录')


class RegisterForm(FlaskForm):
    Username = StringField(label=u'用户名', validators=[DataRequired(u"请输入用户名")])
    telephone = StringField(label=u'手机号码', validators=[DataRequired(u"请输入手机号码")])
    password = PasswordField(label=u'密码', validators=[DataRequired(u"请输入密码")])
    PWD = PasswordField(label=u"确认密码", validators=[DataRequired(u"确认密码不能为空"), EqualTo("password", u'两次密码不一致')])
    submit = SubmitField(label=u'注册')

    def validate_username(self, field):
        if User.query.filter_by(Username=field.data).first():
            raise ValidationError('用户名已注册,请选用其它名称')

    # 自定义邮箱验证器
    def validate_address(self, field):
        if User.query.filter_by(telephone=field.data).first():
            raise ValidationError('该手机号已被使用,请选用其它号码')

 ホームビュー機能

@app.route('/')
def index():
    name = session.get("Username", "请先登录")
    return render_template('index.html') + "你好 %s" % name

ユーザーはそれに追加したビュー機能では、データベース内のフォームデータと一致しているかどうかを確認するために、使用フォーム認証のユーザー名とパスワードでログインし、帰国へのリダイレクト機能を使用して、ユーザー名でセッションの保存

@app.route('/login/', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        Username = form.Username.data
        password = form.password.data
        user = User.query.first()
        if user:
            if Username == user.Username and password == user.password:
                print("用户登录" + "  " + Username, password)
                session['Username'] = Username
                return redirect(url_for("index"))
            print("用户名或者密码错误,请重新输入!")
        else:
            print("未知账号")
    return render_template('login.html', form=form)

ユーザー出口は、セッションがポップ()メソッドを使用することで、このユーザー名出口キュー 

@app.route('/logout/')
def logout():
    if LoginForm.Username:
        session.pop('Username')
        return redirect(url_for('index'))
    else:
        return render_template('index.html')

 次はまた、バリデータがデータベースに送信されたフォームデータの()メソッドは、呼び出しdb.session.commitを()db.session.add使用して追加フォームを使用して実施することが、ユーザ登録の図であります

@app.route('/Register/', methods=['GET', 'POST'])
def Register():
    form = RegisterForm()
    if form.validate_on_submit():
        Username = form.Username.data
        telephone = form.telephone.data
        password = form.password.data
        PWD = form.PWD.data
        user = User(Username=Username, telephone=telephone, password=password)
        db.session.add(user)
        db.session.commit()
        flash("注册成功!")
        print("用户注册" + "  " + Username, telephone, password)
        session['Username'] = Username
        return redirect(url_for("index"))

    return render_template('Register.html', form=form)

すべてのデータテーブルを見つけるために、上記の二つの方法を介してデータベースに保存されて送信された温度センサの数値シミュレーション、ページ上の表示以下

@app.route('/Device_information/')
def Device_information():
    value1 = Device(title='温度模块', value='2°C', state='打开')
    db.session.add_all([value1])
    db.session.commit()
    Device_list = Device.query.all()
    print(Device_list)
    return render_template('Device_information.html', devices=Device_list)

最後に、スタートアップスクリプトは、それを忘れないでください
__name__ == '__main__' の場合:
    #db.drop_all()
    #db.create_all()
    app.run()

ここでの私たちのフロントエンド部分であります

ホームindex.htmlを

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Lora物联网开发平台</title>
</head>
<body>
<h1>Lora物联网开发平台</h1>
<h3><a href="{{url_for('login')}}">用户登录</a></h3>
<h3><a href="{{url_for('Device_information')}}">查看数据</a></h3>
<h3><a href="{{url_for('Register')}}">申请注册</a></h3>
<h3><a href="{{url_for('logout')}}">注销账号</a></h3>
</body>
</html>

ユーザーログインインターフェイスlogin.htmlと

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Lora物联网开发平台</title>
</head>
<body>
<h3 class="page-title">用户登录</h3>
    <form method="post">
        {{ form.csrf_token }}
        <div class="form-container">
            <label for="Username">用户名</label>
            <p><input id="Username" name="Username" required type="text" value=""></p>
            {% for msg in form.Username.errors %}
            <p>{{msg}}</p>
            {% endfor %}
            <label for="password">密码</label>
            <p><input id="password" name="password" required type="password" value=""></p>
            {% for msg in form.password.errors %}
            <p>{{msg}}</p>
            {% endfor %}
            <div class="form-group">
                <input id="submit" name="submit" type="submit" value="立即注册" size="80">
            </div>
        </div>
    </form>
</body>
</html>

登録インターフェースRegister.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Lora物联网开发平台</title>
</head>
<body>
<form method="post">
        {{ form.csrf_token }}
        <div class="form-container">
            <label for="Username">用户名</label>
            <p><input id="Username" name="Username" required type="text" value=""></p>
            {% for msg in form.Username.errors %}
            <p>{{msg}}</p>
            {% endfor %}

            <label for="telephone">手机号码</label>
            <p><input id="telephone" name="telephone" required type="text" value=""></p>
            {% for msg in form.telephone.errors %}
            <p>{{msg}}</p>
            {% endfor %}

            <label for="password">密码</label>
            <p><input id="password" name="password" required type="password" value=""></p>
            {% for msg in form.password.errors %}
            <p>{{msg}}</p>
            {% endfor %}

            <label for="PWD">确认密码</label>
            <p><input id="PWD" name="PWD" required type="password" value=""></p>
            {% for msg in form.PWD.errors %}
            <p>{{msg}}</p>
            {% endfor %}
            <div class="form-group">
                <input id="submit" name="submit" type="submit" value="立即注册" size="80">
            </div>
        </div>
    </form>
</body>
</html>

最後に、私たちのセンサデータは、ページを表示しました

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Lora物联网开发平台</title>
</head>
<body>
<h2 class="page-title">设备数据信息表</h2>
    <ul>
        {% for device in devices %}
        <li>    设备名称: {{ device.title}}   </li>
        <li>    传感数值: {{ device.value}}   </li>
        <li>    设备状态: {{ device.state}}   </li>
        <li>    发送时间: {{ device.time}}    </li>
        <li>.................................</li>
        {% endfor %}
    </ul>
</body>
</html>

 

公開された58元の記事 ウォン称賛31 ビュー40000 +

おすすめ

転載: blog.csdn.net/qq_37504771/article/details/86357727