Я пытаюсь использовать Python и PHP одновременно, что по большей части работает, НО вход в систему, потому что для большей части моего PHP требуется сеанс
from flask import Flask, render_template, request, redirect, session, flash
from app import app
from db import mysql
import pymysql
import bcrypt
import uuid
app.secret_key = 'your_secret_key'
def get_db_connection():
return mysql.connect()
@app.route('/')
def index():
return render_template('login.html')
@app.route('/login', methods=['POST'])
def login():
email = request.form['email']
password = request.form['password']
user_type = request.form['user_type']
connection = get_db_connection()
try:
with connection.cursor(pymysql.cursors.DictCursor) as cursor:
sql = """
SELECT u.*, ut.user_type_name
FROM tbl_users u
JOIN tbl_user_types ut ON u.user_type_id = ut.user_type_id
WHERE u.Email = %s AND ut.user_type_name = %s
"""
cursor.execute(sql, (email, user_type))
user = cursor.fetchone()
if user and bcrypt.checkpw(password.encode('utf-8'), user['Password'].encode('utf-8')): # Verify hashed password
session['UserID'] = user['UserID']
session['UserType'] = user['user_type_name']
session['FirstName'] = user['FirstName']
session['Email'] = user['Email']
session_id = str(uuid.uuid4())
session['session_id'] = session_id
# Store session in the database
insert_session_sql = """
INSERT INTO tbl_sessions (session_id, UserID, UserType, FirstName, Email) VALUES (%s, %s, %s, %s, %s)
"""
cursor.execute(insert_session_sql, (session_id, user['UserID'], user['user_type_name'], user['FirstName'], user['Email']))
connection.commit()
if user['user_type_name'] == 'admin':
return redirect('/admin/home')
else:
return redirect('/user/home')
else:
flash('Invalid email or password')
return redirect('/')
finally:
connection.close()
@app.route('/admin/home')
def admin_home():
if 'session_id' in session:
return render_template('admin_home.html') # Ensure you have an admin_home.html template
else:
return redirect('/')
@app.route('/user/home')
def user_home():
if 'session_id' in session:
return render_template('user_home.html') # Ensure you have a user_home.html template
else:
return redirect('/')
@app.route('/logout')
def logout():
if 'session_id' in session:
session_id = session['session_id']
connection = get_db_connection()
try:
with connection.cursor() as cursor:
delete_session_sql = "DELETE FROM tbl_sessions WHERE session_id = %s"
cursor.execute(delete_session_sql, (session_id,))
connection.commit()
finally:
connection.close()
session.clear()
return redirect('/')
@app.route('/submit-user', methods=['POST'])
def submit_user():
"""
Add a new user to the database.
"""
if request.method == 'POST':
# Get form data
first_name = request.form.get('FirstName')
last_name = request.form.get('LastName')
middle_name = request.form.get('MiddleName')
age = request.form.get('Age')
contact_number = request.form.get('ContactNumber')
address = request.form.get('Address')
email = request.form.get('Email')
password = request.form.get('Password')
user_type_id = request.form.get('user_type_id')
if not all([first_name, last_name, email, password, user_type_id]):
flash("Please fill in all required fields.", "danger")
return redirect('/')
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
connection = get_db_connection()
try:
with connection.cursor() as cursor:
query = """
INSERT INTO tbl_users (FirstName, LastName, MiddleName, Age, ContactNumber, Address, Email, Password, user_type_id)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
cursor.execute(query, (
first_name, last_name, middle_name, age, contact_number, address, email, hashed_password, user_type_id
))
connection.commit()
flash("User successfully added!", "success")
return redirect('/read-all-users-html')
except Exception as e:
flash("An error occurred while adding the user. Please try again.", "danger")
print(f"User creation error: {e}")
finally:
connection.close()
if __name__ == "__main__":
app.run(debug=True)
по какой-то причине не переводится на php, из-за чего, когда вы правильно входите в систему и переходите, например, на домашнюю страницу администратора, он просто перенаправляется обратно на вход в систему. Может ли кто-нибудь порекомендовать мне какое-нибудь решение этой проблемы?
Я проделал некоторые работы, например, сохранил сеанс в базе данных
Я пытаюсь использовать Python и PHP одновременно, что по большей части работает, НО вход в систему, потому что для большей части моего PHP требуется сеанс [code]if (!isset($_SESSION['session_id'])) { header("Location: http://localhost:5000/"); // Redirect to login page if not logged in exit(); } [/code] чтобы проверить, кто вошел в систему, и отобразить соответствующую страницу в зависимости от типа пользователя, сеанс Python [code]from flask import Flask, render_template, request, redirect, session, flash from app import app from db import mysql import pymysql import bcrypt import uuid
connection = get_db_connection() try: with connection.cursor(pymysql.cursors.DictCursor) as cursor: sql = """ SELECT u.*, ut.user_type_name FROM tbl_users u JOIN tbl_user_types ut ON u.user_type_id = ut.user_type_id WHERE u.Email = %s AND ut.user_type_name = %s """ cursor.execute(sql, (email, user_type)) user = cursor.fetchone()
if user and bcrypt.checkpw(password.encode('utf-8'), user['Password'].encode('utf-8')): # Verify hashed password session['UserID'] = user['UserID'] session['UserType'] = user['user_type_name'] session['FirstName'] = user['FirstName'] session['Email'] = user['Email'] session_id = str(uuid.uuid4()) session['session_id'] = session_id
# Store session in the database insert_session_sql = """ INSERT INTO tbl_sessions (session_id, UserID, UserType, FirstName, Email) VALUES (%s, %s, %s, %s, %s) """ cursor.execute(insert_session_sql, (session_id, user['UserID'], user['user_type_name'], user['FirstName'], user['Email'])) connection.commit()
if user['user_type_name'] == 'admin': return redirect('/admin/home') else: return redirect('/user/home') else: flash('Invalid email or password') return redirect('/') finally: connection.close()
@app.route('/admin/home') def admin_home(): if 'session_id' in session: return render_template('admin_home.html') # Ensure you have an admin_home.html template else: return redirect('/')
@app.route('/user/home') def user_home(): if 'session_id' in session: return render_template('user_home.html') # Ensure you have a user_home.html template else: return redirect('/')
@app.route('/logout') def logout(): if 'session_id' in session: session_id = session['session_id'] connection = get_db_connection() try: with connection.cursor() as cursor: delete_session_sql = "DELETE FROM tbl_sessions WHERE session_id = %s" cursor.execute(delete_session_sql, (session_id,)) connection.commit() finally: connection.close() session.clear() return redirect('/')
@app.route('/submit-user', methods=['POST']) def submit_user(): """ Add a new user to the database. """ if request.method == 'POST': # Get form data first_name = request.form.get('FirstName') last_name = request.form.get('LastName') middle_name = request.form.get('MiddleName') age = request.form.get('Age') contact_number = request.form.get('ContactNumber') address = request.form.get('Address') email = request.form.get('Email') password = request.form.get('Password') user_type_id = request.form.get('user_type_id')
if not all([first_name, last_name, email, password, user_type_id]): flash("Please fill in all required fields.", "danger") return redirect('/')
if __name__ == "__main__": app.run(debug=True) [/code] по какой-то причине не переводится на php, из-за чего, когда вы правильно входите в систему и переходите, например, на домашнюю страницу администратора, он просто перенаправляется обратно на вход в систему. Может ли кто-нибудь порекомендовать мне какое-нибудь решение этой проблемы? Я проделал некоторые работы, например, сохранил сеанс в базе данных [code]TABLE `tbl_sessions` ( `session_id` varchar(255) NOT NULL, `UserID` int(11) NOT NULL, `UserType` varchar(50) NOT NULL, `FirstName` varchar(50) NOT NULL, `Email` varchar(100) NOT NULL, `created_at` timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`session_id`), KEY `UserID` (`UserID`), CONSTRAINT `tbl_sessions_ibfk_1` FOREIGN KEY (`UserID`) REFERENCES `tbl_users` (`UserID`) ON DELETE CASCADE [/code] и сеанс будет перенесен на страницу php, но я не знаю, это все равно не сработает.