フラスコシミュレーション開発フレームワーク
物事の背景
まず、プロファイルリンク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>