Я недавно сдал свой окончательный проект для CS50 настолько полно, насколько мог.Я потратил почти три дня, пытаясь отладить это, и не смог заставить программу работать.Теперь я хочу, чтобы это работало для моего личного удовлетворения.
Моя проблема в том, что программа, веб-сайт на Python / Flask с базой данных членства на базе SQLite и функциями blog / nes, которые отлично работали в Интернетесторона проекта, но сторона базы данных будет работать только в ограниченном объеме.
База данных была создана на основе параметров в моем коде Python, но я не могу заполнить ее ни через командную строку, ни через веб-форму.,Я мог бы заполнить базу данных с помощью инструмента SQLite GUI, так что я знаю, что база данных установлена правильно.
Когда я пытаюсь ввести данные через веб-интерфейс, я не получаю ошибок через мониторинг http в командной строке ив базу данных не отправлено никаких данных.
Я что-то упустил, и слишком близко, чтобы увидеть, что происходит.
Справка!
Вот соответствующие частипакет в целом:
init .py:
# Imports
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
app = Flask(__name__)
# Configyuration files
# Secret key
app.config['SECRET_KEY'] = '******************************'
# Database configuration
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db/site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # Stops overhead warning
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = 'join'
login_manager.login_message_category = 'info'
from application import routes
Forms.py:
# Imports
import os
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from flask_login import current_user
from wtforms import StringField, PasswordField, SubmitField, BooleanField, TextAreaField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from application.models import User, Posts, News
# For to register users
class RegistrationForm(FlaskForm):
username = StringField('Username', validators = [DataRequired()])
email = StringField('Email', validators = [DataRequired(), Email()])
password = PasswordField('Password', validators = [DataRequired()])
confirm_password = PasswordField('Confirm password', validators = [DataRequired(), EqualTo('password')])
firstname = StringField('First name', validators = [DataRequired()])
lastname = StringField('Last name', validators = [DataRequired()])
street = StringField('Address 1', validators = [DataRequired()])
address = StringField('Address 2')
city = StringField('City', validators = [DataRequired()])
state = StringField('State', validators = [DataRequired()])
zipcode = StringField('Zip Code', validators = [DataRequired(), Length(min=5, max=10)])
remember = BooleanField('Remember Me')
terms = BooleanField('Terms & Conditions')
citizen = BooleanField('Citizen')
submit = SubmitField('Submit')
def validate_username(self, username):
user = User.query.filter_by(username = username.data).first()
if user:
raise ValidationError('We are sorry, that user name is already being used. Please choose another')
def validate_email(self, email):
user = User.query.filter_by(email = email.data).first()
if user:
raise ValidationError('We are sorry, that email address is already being used. Please choose another')
models.py
# Imports
import os
from datetime import datetime
from application import db, login_manager
from flask_login import UserMixin
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# Database
# Members database
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(20), unique = True, nullable = False)
email = db.Column(db.String(120), unique = True, nullable = False)
password = db.Column(db.String(60), nullable = False)
image_file = db.Column(db.String(20), nullable = False, default = 'default.jpeg')
firstname = db.Column(db.String(20), nullable = False)
lastname = db.Column(db.String(20), nullable = False)
street = db.Column(db.String(20), nullable = False)
address = db.Column(db.String(20))
city = db.Column(db.String(20), nullable = False)
state = db.Column(db.String(2), nullable = False)
zipcode = db.Column(db.String(9), nullable = False)
donates = db.Column(db.String())
posts = db.relationship('Posts', backref = 'author', lazy = True)
news = db.relationship('News', backref = 'contributor', lazy = True)
def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.firstname}', '{self.lastname}', '{self.street}', '{self.address}', '{self.city}', '{self.state}', '{self.zipcode}',)"
rout.py:
# Membership, login/out, and account information
# Join the SBoR Project
@app.route('/join', methods = ['GET', 'POST'])
def join():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username = form.username.data, email = form.email.data, password = hashed_password,
firstname = form.firstname.data, lastname = form.firstname.data,
street = form.street.data, address = form.address.data,
city = form.city.data, state = form.state.data, zipcode = form.zipcode.data)
db.session.add(user)
db.session.commit()
flash(f'Thank you {form.firstname.data}, your account has been successfully created and you may now login.', 'success')
return redirect(url_for('signin'))
return render_template('join.html', title = 'Join', form = form)
# Signin to the SBoR Project
@app.route('/signin', methods = ['GET', 'POST'])
def signin():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email = form.email.data).first()
if user and bcrypt.check_password_hash(user.password, form.password.data):
login_user(user, remember = form.remember.data)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('index'))
else:
flash(f'Login was unsuccessful, please check your email and password', 'danger')
return render_template('signin.html', title = 'Sign in', form = form)
# Logout from the SBoR Project
@app.route('/signout')
def signout():
logout_user()
return redirect(url_for('index'))
Это то, что я получаю, когда я отслеживаю http-трафик в Powershell:
* Serving Flask app "application" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [12/Dec/2018 17:23:13] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Dec/2018 17:23:13] "GET /static/styles.css HTTP/1.1" 200 -
127.0.0.1 - - [12/Dec/2018 17:23:21] "GET /join HTTP/1.1" 200 -
127.0.0.1 - - [12/Dec/2018 17:23:21] "GET /static/favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [12/Dec/2018 17:24:03] "POST /join HTTP/1.1" 200 -
127.0.0.1 - - [12/Dec/2018 17:24:03] "GET /static/favicon.ico HTTP/1.1" 200 -
Когда я пытаюсь заполнитьбаза данных в командной строке Python, я получаю это:
site.query.all()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'site' is not defined
db.session.add(username='username', firstname='First', lastname='Last', email='person@mail.com')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'db' is not defined
Вот дерево пакетов:
application
├───db
│ └─── site.db
├───static
│ ├─── downloads
│ └─── profile_pics
├───templates
│ ├─── blog
│ ├─── constitution
│ ├─── errors
│ ├─── federalist
│ ├─── includes
│ ├─── news
│ ├─── policies
│ ├─── proposals
│ ├─── sbr
│ ├─── __init__.py
│ ├─── routes.py
│ ├─── forms.py
│ ├─── models.py
│ └───
└─── run.py
Любая помощь будет принята с благодарностью