flaskとmysql(python)の接続例を詳しく解説

Y2J
リリース: 2017-04-26 11:09:59
オリジナル
5652 人が閲覧しました

flask をベースにした Web アプリケーションの 4 番目の記事が誕生しました。この記事では主に flask と mysql を相互接続する方法を紹介します。興味のある方は参考にしてください。 前章で実装したログイン部分を部分関数と呼びます。ユーザー名とパスワードを固定値として書き込むことは絶対に不可能であるため、機能全体では少なくとも登録、ログイン、パスワードの変更などが必要であり、これらの値をデータベースに保存する方法が必要です。

現在主流のデータベースは、リレーショナル データベースと NoSql データベースの 2 種類に分かれており、中小規模のシステムでは、2 つのデータベースのパフォーマンスと使いやすさは同等であり、どちらも良い選択肢となります。

基本構成


ここでは、SQLAlchemy データベース フレームワークの flask 統合パッケージ、つまり flask-SQLAlchemy を使用してデータベース操作を実行します。

SQLAlchemy は、データベース操作を簡素化する非常に優れたフレームワークであり、非常に使いやすい高レベルの ORM 関数と低レベルの SQL 関数を提供します。

インストール方法は前のタイプと同じ、または pip コマンドです:

pip3.6 install flask-sqlalchemy
ログイン後にコピー

インストールが完了したら、最初にパッケージをインポートします:

from flask.ext.sqlalchemy import SQLAlchemy
ログイン後にコピー

次に、リンク文字列を設定します。

app.config["SQLALCHEMY_DATABASE_URI"]='mysql://root:1234@localhost/cblog'
ログイン後にコピー

設定リクエスト 完了後に変更が自動的に送信されます:

app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
ログイン後にコピー

SQLAlchemyをインスタンス化します:

db=SQLAlchemy(app)
ログイン後にコピー

モデル設定


インストールが完了したら、ログイン例の改善を続け、デフォルトを変更します。 pyファイルにUserモデル(クラス)とRoleモデル(関連付けを表示するため)を追加します

Roleクラス

class Role(db.Model): #需继承模型
 __tablename__="roles" #db中表明,如果不设置,则会与class同的默认名
 id=db.Column(db.Integer,primary_key=True) #SQLAlchemy要求必须有主键,一般命名为id即可
 name=db.Column(db.String(50),unique=True) #表示name为字符串,不重复
 users=db.relationship("User",backref='role') #关联user模型,并在user中添加反向引用(backref)
ログイン後にコピー

Userクラス

class User(db.Model):
 __tablename__="users"
 id=db.Column(db.Integer,primary_key=True)
 username=db.Column(db.String(50),unique=True,index=True) #此列带索引
 password=db.Column(db.String(50))
 role_id=db.Column(db.Integer,db.ForeignKey("roles.id")) #外键指向roles表中的id列
ログイン後にコピー

以下は実行方法と侵入可能かどうかを考慮する必要があります。ロジック コードは、判定などのロジック コードにハードコーディングできない必要があります。db ステータスのコードはパラメーターとして app.run() に渡されるため、この時点でシェルが役に立ちます

設定スクリプト


flask でコマンドラインスクリプトをサポートしたい場合は、まず flask-script 拡張機能をインストールする必要があります:

pip3.6 install flask-script
ログイン後にコピー

default.py のコードを変更します:

from flask.ext.script import Manager
mamager=Manager(app)
....
if __name__=='__main__':
 #app.run(debug=True)
 mamager.run()
ログイン後にコピー

変更後、再度実行します:

python default.py
ログイン後にコピー

正常に実行されなかったことがわかりましたが、プロンプトが表示されました:


それぞれshell (実行スクリプト)、runserver (サービスの開始)、helpの後ろにパラメータが必要であることがわかります

サービスを開始します以下:

python default.py runserver
ログイン後にコピー

サービスは正常に実行されました

データベースの詳細設定


しかし、この時点でサイト (127.0.0.1:5000) にアクセスすると、mysql が存在しないことを示す 500 エラーが表示されます。モジュール、これはなぜですか?明らかに、その理由は、mysql ドライバーがインストールされていないことです。ドライバーをインストールするには、pip コマンドを使用します。 C++ ツール パッケージは、プロンプトのダウンロード アドレス

landinghub.visualstudio.com/visual-cpp-build-tools に従ってください

ダウンロードが完了したら、直接 exe ファイルになります

、再起動してインストールします。 MySQL-python はまだ動作しないことがわかりました。Baidu 以降では、MySQLdb ライブラリは python2.7 までしかサポートされず、3.x はサポートされなくなりました。その場合は、他の方法を使用して PyMySQL ライブラリを使用する必要があります。 :

pip3.6 install MySQL-python
ログイン後にコピー

次に、default.py のコードを変更して 2 行を追加します:

pip3.6 install PyMySQL
ログイン後にコピー

ソース コードを入力し、次の行に注目してください:

import pymysql
pymysql.install_as_MySQLdb()
ログイン後にコピー

を使用して mysql に接続します。

ブラウザに接続を入力し、サイトに正しくアクセスしてください。

次に、シェルを使用してデータベーステーブルを作成し、default.pyルートディレクトリに入ります:

sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
ログイン後にコピー

この時点でエラーが報告されない場合は、データベーステーブルが作成されるはずです:


Database移行

次に、この時点でモデルへの変更はデータベースに反映されません。では、変更した場合はどうすればよいでしょうか。現時点では、これも非常に簡単です:

python default.py shell
from default import db
db.create_all()
ログイン後にコピー

ただし、これはデバッグ中にのみ使用されます。データベースに既にデータがある場合、現時点ではデータベース移行プラグインの出番です。最初のことは同じで、インストールする必要があります:

db.drop_all()
db.create_all()
ログイン後にコピー

前と同様に、インストール後の構成のために、default.py ファイルを変更します:

pip3.6 install flask-migrate
ログイン後にコピー

次に、init コマンドを使用して移行ウェアハウスを初期化します
from flask.ext.migrate import Migrate,MigrateCommand
migrate=Migrate(app,db) #配置迁移
mamager.add_command("db",MigrateCommand) #配置迁移命令
ログイン後にコピー

コマンド ラインに次のように表示されます:

次に、移行ディレクトリを追加します:

は、移行ファイルが初期化されたことを示します。

migrate框架提供了一些命令来进行迁移操作,分别为(使用default.py文件举例):

#根据差异创建迁移
python default.py db migrate -m "说明"
#改动差异 
python default.py db upgrade
#取消差异改动
python default.py db downgrade
ログイン後にコピー

回到表单

接下来看看登录如何与数据库关联起来,修改login方法内的代码:

@app.route("/login",methods=["POST"])
def loginPost():
 username=request.form.get("username","")
 password=request.form.get("password","")
 user=User.query.filter_by(username=username,password=password).first() #数据库查询
 if user is not None:
 session["user"]=username
 return render_template("/index.html",name=username,site_name='myblog')
 else:
 flash("您输入的用户名或密码错误")
 return render_template("/login.html") #返回的仍为登录页
ログイン後にコピー

执行结果非常完美。

一些总结

下面是一些关于python和db相连的总结性的东西

数据类型

列选项

数据库操作

查询过滤器

经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能。

以上がflaskとmysql(python)の接続例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート