基本原理
这段代码是一个使用Flask框架的简单登录和注册系统。它使用了Flask-PyMongo扩展来连接MongoDB数据库,Flask-Login扩展来处理用户认证。以下是代码的主要部分:
- 导入所需的库和模块。
- 初始化Flask应用,配置MongoDB连接和Flask-Login。
- 定义User类,用于表示用户。
- 定义路由和视图函数,处理主页、注册、登录、注销和受保护页面的请求。
- 定义user_loader函数,用于从用户ID加载用户对象。
- 如果是主模块,运行Flask应用。
示例代码
from flask import Flask, request, render_template,redirect,url_for
from flask_pymongo import PyMongo
from flask_login import LoginManager, UserMixin, login_user, current_user, login_required, logout_user
from dotenv import load_dotenv
import osapp = Flask(__name__)
load_dotenv()
app.config["MONGO_URI"] = f"mongodb+srv://intumu.com:{os.getenv('config_MONGO_URI')}@intumu.com/user"
app.secret_key = os.getenv('app_secret_key')
mongo = PyMongo(app)
login_manager = LoginManager()
login_manager.init_app(app)class User(UserMixin):pass@app.route("/")
def home_page():return render_template("home.html",current_user=current_user)@app.route("/register", methods=['GET', 'POST'])
def register_page():error_message = ""if request.method == 'POST':email = request.form['email']username = request.form['username']password = request.form['password']existing_email = mongo.db.user.find_one({'email': email})existing_username = mongo.db.user.find_one({'username': username})if existing_email:error_message += "\nEmail already exists!"if existing_username:error_message += "\nUsername already exists!"if not existing_email and not existing_username:user = {'email': email, 'username': username, 'password': password}mongo.db.user.insert_one(user)return redirect(url_for('login_page'))return render_template("register.html",error_message=error_message,current_user=current_user)@app.route("/login", methods=['GET','POST'])
def login_page():error_message = ""if request.method == 'POST':if current_user.is_active: return 'has logined'username = request.form['username']password = request.form['password']user_find = mongo.db.user.find_one({'username': username})if user_find and user_find['password']==password:user = User() user.id = username login_user(user) return render_template("home.html",current_user=current_user)elif user_find:error_message = '\nWrong password'else:error_message = "\nUnknown username"return render_template("login.html",error_message=error_message,current_user=current_user)return render_template("login.html")@login_manager.user_loader
def user_loader(username): user = User() user.id = usernamereturn user @app.route('/logout')
def logout_page(): if current_user.is_active: logout_user() return 'Logged out'else:return "you aren't login"@app.route('/protected')
@login_required # intumu.com
def protected_page(): if current_user.is_active: return 'Logged in as: ' + current_user.id + 'Login is_active:True'if __name__ == '__main__':app.run(debug=True,port=8000)
注意事项
- 在运行此代码之前,请确保已安装所有必需的库和模块,并正确配置MongoDB连接。
- 为了安全起见,不要在代码中直接存储敏感信息,如数据库连接字符串和密钥。在这个例子中,我们使用了Python的dotenv库来加载环境变量。
- 在生产环境中,不要使用Flask的默认开发服务器,而应该使用更强大的WSGI服务器,如Gunicorn或uWSGI。
- 在处理用户输入时,始终要注意防止SQL注入和其他安全漏洞。在这个例子中,我们使用了MongoDB的查询方法,它已经自动处理了这些问题。
civilpy:Python数据分析及可视化实例目录942 赞同 · 36 评论文章编辑