このチュートリアルシリーズの前のパートでは、バケットリストアプリケーションにログインおよびログアウト機能を実装しました。シリーズのこのパートでは、ユーザーがバケットリストアイテムを追加して表示するために必要なバックエンドとフロントエンドを実装します。
はじめに
GitHubからのチュートリアルの前の部分のクローンを作成することから始めましょう。
git clone https://github.com/jay3dec/PythonFlaskMySQLApp_Part2.git
ソースコードのクローンが作成されたら、プロジェクトディレクトリに移動して、Webサーバーを起動します。
cd PythonFlaskMySQLApp_Part2 python app.py
ブラウザでhttp:// localhost:5002 /を指定すると、アプリケーションが実行されているはずです。
バケットリストアイテムの追加
ステップ1:アイテムを追加するためのインターフェースを作成する
まず、ログインしているユーザーがバケットリストアイテムを追加するためのインターフェースを作成します。 templates
に移動します プロジェクトディレクトリ内のフォルダを作成し、addWish.html
というファイルを作成します。 。 addWish.html
を開きます 次のHTMLコードを追加します:
<!DOCTYPE html> <html lang="en"> <head> <title>Python Flask Bucket List App</title> <link href="https://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet"> <script src="../static/js/jquery-1.11.2.js"></script> </head> <body> <div class="container"> <div class="header"> <nav> <ul class="nav nav-pills pull-right"> <li role="presentation" class="active"><a href="#">Add Item</a> </li> <li role="presentation"><a href="/logout">Logout</a> </li> </ul> </nav> <h3 class="text-muted">Python Flask App</h3> </div> <section> <form class="form-horizontal" method="post" action="/addWish"> <fieldset> <!-- Form Name --> <legend>Create Your Wish</legend> <!-- Text input--> <div class="form-group"> <label class="col-md-4 control-label" for="txtTitle">Title</label> <div class="col-md-4"> <input id="txtTitle" name="inputTitle" type="text" placeholder="placeholder" class="form-control input-md"> </div> </div> <!-- Textarea --> <div class="form-group"> <label class="col-md-4 control-label" for="txtPost">Post</label> <div class="col-md-4"> <textarea class="form-control" id="txtPost" name="inputDescription"></textarea> </div> </div> <!-- Button --> <div class="form-group"> <label class="col-md-4 control-label" for="singlebutton"></label> <div class="col-md-4"> <input id="singlebutton" name="singlebutton" class="btn btn-primary" type="submit" value="Publish" /> </div> </div> </fieldset> </form> </section> <footer class="footer"> <p>© Company 2015</p> </footer> </div> </body> </html>
app.py
を開きます 新しいルートとメソッドを追加して、Add Wish
を表示します ページ。
@app.route('/showAddWish') def showAddWish(): return render_template('addWish.html')
userHome.html
を開きます 新しいメニュー項目を追加して、Add Wish
にリンクします ページ。
<li role="presentation"><a href="/showAddWish">Add Wish</a></li>
変更を保存して、サーバーを再起動します。ブラウザでhttp:// localhost:5002にアクセスし、有効なメールアドレスとパスワードを使用してログインします。ログインしたら、ウィッシュを追加をクリックします リンクをクリックすると、[ウィッシュの追加]ページが表示されます。
ステップ2:データベースの実装
バケットリストにアイテムを追加するには、tbl_wish
というテーブルを作成する必要があります 。
CREATE TABLE `tbl_wish` ( `wish_id` int(11) NOT NULL AUTO_INCREMENT, `wish_title` varchar(45) DEFAULT NULL, `wish_description` varchar(5000) DEFAULT NULL, `wish_user_id` int(11) DEFAULT NULL, `wish_date` datetime DEFAULT NULL, PRIMARY KEY (`wish_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
tbl_wish
title
があります 、description
およびID
願い事を作成したユーザーの
次に、MySQLストアドプロシージャを作成して、tbl_wish
にアイテムを追加する必要があります。 テーブル。
USE `BucketList`; DROP procedure IF EXISTS `BucketList`.`sp_addWish`; DELIMITER $$ USE `BucketList`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_addWish`( IN p_title varchar(45), IN p_description varchar(1000), IN p_user_id bigint ) BEGIN insert into tbl_wish( wish_title, wish_description, wish_user_id, wish_date ) values ( p_title, p_description, p_user_id, NOW() ); END$$ DELIMITER ; ;
ステップ3:MySQLストアドプロシージャを呼び出すPythonメソッドを作成する
addWish
というメソッドを作成します app.py
で 。
@app.route('/addWish',methods=['POST']) def addWish(): # Code will be here
このメソッドにデータを投稿するため、定義されたルートで明示的に宣言しました。
addWish
が呼び出されたとき メソッドでは、セッション変数user
をチェックして、それが本物の呼び出しであるかどうかを検証する必要があります。 存在します。セッションを検証したら、投稿されたtitle
を読み取ります およびdescription
。
_title = request.form['inputTitle'] _description = request.form['inputDescription'] _user = session.get('user')
必要な入力値を取得したら、MySQL接続を開き、ストアドプロシージャsp_addWish
を呼び出します。 。
conn = mysql.connect() cursor = conn.cursor() cursor.callproc('sp_addWish',(_title,_description,_user)) data = cursor.fetchall()
ストアドプロシージャを実行した後、データベースに変更をコミットする必要があります。
if len(data) is 0: conn.commit() return redirect('/userHome') else: return render_template('error.html',error = 'An error occurred!')
これが完全なaddWish
です メソッド。
@app.route('/addWish',methods=['POST']) def addWish(): try: if session.get('user'): _title = request.form['inputTitle'] _description = request.form['inputDescription'] _user = session.get('user') conn = mysql.connect() cursor = conn.cursor() cursor.callproc('sp_addWish',(_title,_description,_user)) data = cursor.fetchall() if len(data) is 0: conn.commit() return redirect('/userHome') else: return render_template('error.html',error = 'An error occurred!') else: return render_template('error.html',error = 'Unauthorized Access') except Exception as e: return render_template('error.html',error = str(e)) finally: cursor.close() conn.close()>
すべてのソースコードを保存して、サーバーを再起動します。ブラウザでhttp:// localhost:5002にアクセスし、有効なメールアドレスとパスワードを使用してログインします。サインインしたら、ウィッシュを追加をクリックします リンク。 title
を入力してください およびdescription
ご希望の場合は、公開をクリックしてください 。ウィッシュを正常に追加すると、ユーザーのホームページにリダイレクトされます。 MySQLデータベースにログインすると、tbl_wish
にウィッシュが含まれているはずです。 テーブル。
バケットリストアイテムを表示する
ステップ1:ウィッシュを取得するためのストアドプロシージャを作成する
ユーザーが作成したウィッシュを取得するMySQLストアドプロシージャを作成しましょう。ユーザーのID
が必要になります パラメータとして、特定のユーザーIDによって作成されたウィッシュのデータセットを返します。
USE `BucketList`; DROP procedure IF EXISTS `sp_GetWishByUser`; DELIMITER $$ USE `BucketList`$$ CREATE PROCEDURE `sp_GetWishByUser` ( IN p_user_id bigint ) BEGIN select * from tbl_wish where wish_user_id = p_user_id; END$$ DELIMITER ;
ステップ2:データを取得するためのPythonメソッドを作成する
次に、sp_GetWishByUser
を呼び出すPythonメソッドを作成しましょう。 ユーザーが作成したウィッシュを取得するためのストアドプロシージャ。 getWish
というメソッドを追加します app.py
で 。
@app.route('/getWish') def getWish(): try: if session.get('user'): _user = session.get('user') else: return render_template('error.html', error = 'Unauthorized Access') except Exception as e: return render_template('error.html', error = str(e))
上記のコードに見られるように、このメソッドは有効なuser
でのみ呼び出すことができます セッション。有効なユーザーセッションを検証したら、MySQLデータベースへの接続を作成し、ストアドプロシージャsp_GetWishByUser
を呼び出します。 。
_user = session.get('user') # Connect to MySQL and fetch data con = mysql.connect() cursor = con.cursor() cursor.callproc('sp_GetWishByUser',(_user,)) wishes = cursor.fetchall()
MySQLからデータをフェッチしたら、データを解析してdictionary
に変換します。 JSON
として簡単に返すことができるようにします 。
wishes_dict = [] for wish in wishes: wish_dict = { 'Id': wish[0], 'Title': wish[1], 'Description': wish[2], 'Date': wish[4]} wishes_dict.append(wish_dict)
データをdictionary
に変換した後 データをJSON
に変換します 戻ってきます。
return json.dumps(wishes_dict)
これが完全なgetWish
です メソッド。
@app.route('/getWish') def getWish(): try: if session.get('user'): _user = session.get('user') con = mysql.connect() cursor = con.cursor() cursor.callproc('sp_GetWishByUser',(_user,)) wishes = cursor.fetchall() wishes_dict = [] for wish in wishes: wish_dict = { 'Id': wish[0], 'Title': wish[1], 'Description': wish[2], 'Date': wish[4]} wishes_dict.append(wish_dict) return json.dumps(wishes_dict) else: return render_template('error.html', error = 'Unauthorized Access') except Exception as e: return render_template('error.html', error = str(e))
ステップ3:JSONデータをHTMLにバインドする
ユーザーのホームページが読み込まれると、getWish
が呼び出されます。 jQuery AJAXを使用してメソッドを作成し、受信したデータをHTMLにバインドします。 userHome.html
内 次のjQuery
を追加します AJAXスクリプト:
<script> $(function() { $.ajax({ url: '/getWish', type: 'GET', success: function(res) { console.log(res); }, error: function(error) { console.log(error); } }); }); </script>
上記の変更を保存して、サーバーを再起動します。有効なメールアドレスとパスワードでログインしたら、ブラウザコンソールを確認すると、次のようにデータベースからウィッシュリストが取得されます。
[{ "Date": "Fri, 23 Jan 2015 23:26:05 GMT", "Description": "I want to climb Mount Everest", "Id": 1, "Title": "Climb Everest" }, { "Date": "Fri, 23 Jan 2015 23:27:05 GMT", "Description": "I want to jump from top of a mountain", "Id": 2, "Title": "Bungee Jump" }]
ここで、JSON
を反復処理する必要があります データをHTMLにバインドします。ブートストラップlist-group
を使用します ウィッシュリストアイテムを表示します。 list-group
の基本的なテンプレートは次のとおりです :
<div class="list-group"> <a href="#" class="list-group-item active"> <h4 class="list-group-item-heading">Wish Title</h4> <p class="list-group-item-text">Wish Description</p> </a> </div>
上記のHTMLコードをjumbotron
に追加します userHome.html
のdiv 。外観は次のとおりです。
次に、上記のlist-group
を作成します。 ウィッシュリストエントリごとに動的にdivし、それをjumbotron
に追加します div。 getWish
の成功コールバック内 関数呼び出し、次のようにdivを作成します:
var div = $('<div>') .attr('class', 'list-group') .append($('<a>') .attr('class', 'list-group-item active') .append($('<h4>') .attr('class', 'list-group-item-heading'), $('<p>') .attr('class', 'list-group-item-text')));
上記のdivのクローンを作成して、list-group
を作成します。 ウィッシュリストアイテムごとにdiv。次に、返されたJSON
を解析します JavaScriptオブジェクトへの文字列。
var wishObj = JSON.parse(res);
ここで、wishObj
を繰り返し処理します ウィッシュアイテムごとに、新しいdivのクローンを作成し、それをjumbotron
に追加します。 div。
var wish = ''; $.each(wishObj, function(index, value) { wish = $(div).clone(); $(wish).find('h4').text(value.Title); $(wish).find('p').text(value.Description); $('.jumbotron').append(wish); });
上記の変更を保存して、サーバーを再起動します。有効なメールアドレスとパスワードを使用してログインすると、特定のユーザーが作成したウィッシュのリストが表示されます。