-1

我正在使用 Flask 进行项目,我想在用户登录时创建一个会话。我按照文档进行操作,但我的脚本不起作用并在打开后直接关闭。所以,无法在我的浏览器中启动我的项目。

我的代码如下:

#! /usr/bin/python
# -*- coding:utf-8 -*-

from flask import Flask, url_for, request, session
import mysql.connector
app = Flask(__name__)

@app.route('/connexion/', methods=['GET', 'POST'])
def connexion():
    if request.method == 'POST':
        if request.form['mail'] == "":
            return affichage_form_mail(erreur = "001")
        else:
            cnx = mysql.connector.connect(user='admin', password='mysql', host='localhost', database='colocation')
            cursor = cnx.cursor()
            query = ("SELECT COUNT('email'), password FROM user WHERE email = '" + request.form['mail'] + "'")
            cursor.execute(query)
            i = cursor.fetchone()
            if str(i[0]) != "1":
                # on regarde le nombre d'enregistrements. Si diff de 0, on réaffiche le formulaire avec un code d'erreur 001
                return affichage_form_mail(erreur = "001")
            else:
                # on vérifie le mdp
                if request.form['password'] != str(i[1]):
                    # mot de passe faux, on reaffiche form_login avec en argument l'erreur et le mail
                    return affichage_form_mail(request.form['mail'], "002")
                else:
                    # l'user est connecté. On le redirige vers son compte et on met une variable dans la session
                    session['connect'] = True
            cursor.close()
            cnx.close()
    else:
        return affichage_form_mail()

def affichage_form_mail(mail='Adresse email', erreur='none'):
    aff_erreur = ""
    if erreur == "001" :
        aff_erreur = "Email inexistant"
    if erreur == "002" :
        aff_erreur = "Mot de passe inccorect"
    if erreur == "003" :
        aff_erreur = "Il faut indiquer email"
    return aff_erreur + '<form action="" method="post"><input type="text" name="mail" value= "' + mail + '" /><input type="text" name="password" /><input type="submit" value="Envoyer" /></form>'

if __name__ == '__main__':
app.secret_key = "dd"
    app.run(debug=True)

我知道我的密钥不是那么安全,但这不是重点。请注意,我尝试不使用密钥(不要问为什么......),我可以在 Chrome 中打开我的项目,但我当然有一条错误消息,告诉我必须输入密钥。

我希望你能帮助我......我检查了官方文档并复制粘贴以确保避免任何错误,但它仍然无法正常工作。

4

1 回答 1

1

你的缩进app.secret_key = "dd"是错误的。它必须与app.run调用处于同一级别。

缩进在 Python 中不是可选的——它是语法的一部分。您必须以一致的方式缩进块,否则您的脚本将无法运行。

顺便说一下,Python 会为您提供非常python yourfile.py有用的错误消息 - 所以请使用. 这样,当脚本终止时终端不会关闭,您实际上会看到错误,而不必在这里询问。


你也处理 SQL 真的错了:

query = ("SELECT COUNT('email'), password FROM user WHERE email = '" + request.form['mail'] + "'")
cursor.execute(query)

该代码有一个巨大的 SQL 注入漏洞。改为这样做:

query = "SELECT COUNT('email'), password FROM user WHERE email = %s"
cursor.execute(query, [request.form['mail']])

这样,数据库(或数据库 api)将以安全的方式处理您的参数。


另一件事:您应该真正使用 Jinja2 模板,而不是创建丑陋的嵌入式 HTML。它是一个优秀的模板引擎,无论如何它已经是 Flask 的依赖项了。

于 2013-10-21T17:26:32.977 回答