Веб-приложение Python не будет подключаться к базе данных - PullRequest
0 голосов
/ 16 декабря 2018

Я недавно сдал свой окончательный проект для 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

Любая помощь будет принята с благодарностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...