百三十から五への道を開い測定:ログイン認証を実装します

 

 

新しいテーブル、ユーザー情報が挿入されています

テーブルのUserInfo(作成
ユーザー名テキストを、
EmaliのTEXT、
パスワード
);

UserInfo値( '管理者'、 '[email protected]'、 '123456')に挿入します。
UserInfo値( 'ジェリー'、 '[email protected]'、 '654321')に挿入します。

UserInfoから*を選択します。

 

login.htmlと

 

 

結果を見てください

 

 

ログインロジック

 

 

エラーログ

 

 

 

 

正しいログ

 

 

 

 

ビュー

位:. 8 UTF-コーディング
インポートsqlite3の
日時日時インポートから
フラスコフラスコインポート要求、render_template、リダイレクト、なurl_forからは、G

アプリケーションはフラスコ(__ name__)=

データベースR&LT = '\ DB \ feedbach.db'

================」 ==================パッケージSQLヘルパー============================ = '


DEFのmake_dicts(カーソル、行):
"" "データベースの辞書にカーソルタプル取得したリストには" ""
((IDX、列挙の値のためcursor.description [IDX] [0]値)で(辞書を返します行))


DEF)(get_db:
"" ")(CVのデータベース・リンクを取得します
G:フラスコ組み込み変数:G = LocalProxy(部分(_lookup_app_object、" G "))
" ""
DB = GETATTR(G '_database'、なし)
IFないDB:
DB = G._database = sqlite3.connect(データベース)
= make_dictsはdb.row_factory
DB返す


:DEFのEXECUTE_SQL(SQL、のparams =())
"" "" "データ結果の挿入、更新、削除を返さないSQL文の実行"
。get_db C =()カーソル()
c.executeを(SQLを、のparams)
c.connection.commit()


1 = False)が、DEF query_sql(SQLは、=(paramsは):
"" "" "1 = Falseのデータクエリが複数回返された"
C = get_db()カーソルを()。
= c.execute結果(SQL、のparams).fetchall()
c.close()
の戻り(IF結果、他[0]なしを生じない)他の場合は、1つの結果


、現在の実行コンテキストのアプリの中に破壊された#のapp.teardown_appcontext @
デフCLOSE_CONNECTION(exeption ):
"" "閉じるデータベース" ""
DB = GETATTR(G '_database'、なし)
デシベルでない場合はなし:
db.close()


「================================================= =======================」


app.route( "/")@
指数デフ():
リターンrender_template( 'base.html')


@app。ルート( '/ログイン/'、メソッド= [ 'GET'、 'POST'])
デフログイン():
"" "登录"""
もしrequest.method == 'POST':
ユーザー名= request.form.get( 'ユーザ名')
パスワード= request.form.get( 'パスワード')
などのSQL =「SELECT COUNT(*)[カウント]のUserInfoどこからユーザー名=?パスワード=?」
結果= query_sql(SQL、(ユーザー名、パスワード)、TRUE)
INT(result.get( 'カウント'))の場合> 0:
リターンリダイレクト(なurl_for( 'リスト'




#模板继承
@ app.route( "/フィードバック/")
フィードバックDEF():
戻りrender_template( 'post.html')


app.route @( "/ post_feedback /"、メソッド= "POST"])
DEF(post_feedback ):
"" "提交视图"""
もしrequest.method == 'POST':如果是#ポスト请求就获取表单值
サブジェクト= request.form.get( '件名'、なし)
区分= request.form.get ( 'カテゴリ'、1)
ユーザ名= request.form.get( 'ユーザ名')
メール= request.form.get( 'メール')
体= request.form.get( '体')
release_time = STR(datetime.now ())
状態= 0
プリント(件名、区分コード、ユーザ名、電子メール、ボディ、状態、release_time)
CONN = sqlite3.connect(データベース)
conn.cursor = C()
を使用したSQLインジェクションを防ぎますか?代わりの値の
SQL = "フィードバックのINSERT INTO(Subjeck、区分、ユーザー名、電子メール、ボディ、州、ReleaseTime)の値(?、?、?、?、?、?、?)"
C.execute(SQL、(件名、区分、ユーザ名、電子メール、体、国家、release_time))
conn.commit()
はconn.close()
のページを埋めるために提出ジャンプの後に繰り返し提出によって引き起こさカトンを防ぐために#
リターンリダイレクト(なurl_for(「フィードバック」))


@ app.route( "/一覧/")
DEFリスト():
"" " "すべての問題が表示さ""
SQL = "SELECT ROWID、* ROWID DESC順からのフィードバック"
#= query_sqlフィードバック(SQL)
印刷(フィードバック)
キー= request.args.get( 'キー'、 '')
SQL =「f.ROWID、Fを選択するには。*、フィードバックからINNER F c.CategoryNameは次のようにc.ROWID = f.CategoryIDどこf.Subjeck上のカテゴリcを登録しようか!f.ROWID順'
フィードバック= query_sql(SQL、(F '%{キー}%'))
戻りrender_template( 'フィードバックするlist.html'、アイテム=フィードバック)


@ app.route(' /デル/ <ID > / ')
DEF delete_feedback(ID = 0):
"" "删除问题、前端传ID "が""
CONN = sqlite3.connect(DATABASE)
C = conn.cursor()
= "?ROWID =フィードバックから削除" SQL
c.execute(SQL、(ID))
conn.commit()
はconn.close()
(('リスト')なurl_for)リターンリダイレクト


功能#编辑
@ app.route( "/編集/ <ID> /")
デフ編集(ID =なし):


= SQL「SELECT ROWID、カテゴリからカテゴリ名」
カテゴリー= query_sql(SQL)
#IDは、現在の情報を取得し、変更準備するフォームを形成するためにバインドする
SQL =「SELECT ROWID、ROWIDからWHERE *フィードバック=?」
curren_feedback = query_sqlを(SQL、(ID)、TRUE)
リターンSTR(curren_feedback)#ビューシーケンスデータは、チェックアウト、ソート容易にするためのHTMLをレンダリング
render_templateを返す( 'edit.html'、カテゴリー=カテゴリー、アイテム= curren_feedback)


app.route @( "/ save_edit /"、メソッド= [ 'POST'])
DEFのsave_edit():
"" "" "編集を保存"
request.method IF == 'POST':
ID = request.form.get( 'ROWID'、なし)
返信= request.form.get( '返信')
状態= request.form.get。1 IF( '状態'、0)==他の0 'オン'
SQL =「更新フィードバックは、返信を設定= ?,州=?どこROWID =?」
CONN = sqlite3.connect(DATABASE)
C = conn.cursor()
c.execute(SQL、(応答、状態、ID))
conn.commit()
はconn.close()
リターンリダイレクト(なurl_for( 'リスト'))


であれば__name__ == '__main__':
app.run(
デバッグ=真

 

HTML

{%が'base.html' %を拡張} 

{%ブロックmain_contentの%}

<! -登录界面- >
<DIVクラスは= "行">
<DIV CLASS = "COL-MD-6 COL-MD-オフセット-3 ">
<DIV CLASS ="パネルパネル-デフォルト">
<DIV CLASS ="パネルの見出し">
<H4>登录</ H4>
</ div>
<divのクラス="パネル体">
<フォームアクション=" #」クラス= "フォーム水平"方式= "ポスト">
<DIV CLASS = "フォームグループ">
"</ label>は>用户名、ユーザ名=のための<ラベル"
テキスト"の<input type ="クラス= "フォームコントロール"名前= "ユーザ名" ID = "ユーザ名">
</ div>
<divのクラス= "フォームグループ">
</ label>は:密码<= "パスワード"のラベル>
の<input type = "text"クラス= "フォームコントロール"名前= "パスワード" ID = "パスワード">
</ div>
<divのクラス= "フォーム-グループ">
の<input type ="提出」クラス= "BTN BTN原色"値= "登录">
</ div>
</ FORM>
</ div>
<DIV CLASS = "フッタ">
コピー;版权所有
</ DIV>
</ div>
</ div>
</ div>








{%の末端ブロック%}

 

おすすめ

転載: www.cnblogs.com/zhongyehai/p/11461904.html