2017-10-02 5 views
0

私はかなりの間、この問題を抱えています。送信されたフォームのデータを含むSQLiteデータベースに行を追加しようとしています。ただし、データベースにデータが追加されていないようです。奇妙なのは、データベースに手動でデータを追加する機能(詳細は後述)を実行するとうまくいくことです。 :/どんな助けでも大歓迎です!FlaskとFlask-WTFを使用してSQLiteデータベースに行を追加できません

私は以下の4つのコードセクション、サインフォームの作成、フラスコのルーティング機能、データベースの挿入方法、最後にフォームのHTMLを持っています。

私は、ルーティング・ファイル内の私のサインアップ()関数である、ということに続き

from flask_wtf import FlaskForm 
from wtforms import StringField, PasswordField, SubmitField 
from wtforms.validators import DataRequired, Email, Length 

class SignupForm(FlaskForm): 
    username = StringField("Username", validators=[DataRequired("Username required!")]) 
    first_name = StringField("First Name", validators=[DataRequired("First name required!")]) 
    last_name = StringField("Last Name", validators=[DataRequired("Last name required!")]) 
    email = StringField("E-Mail", validators=[DataRequired("E-mail required!"), Email("Please enter a valid e-mail!")]) 
    password = PasswordField("Password", validators=[DataRequired("Password required!"), Length(min=5, message=("Password must be at least 5 characters."))]) 
    submit = SubmitField("Sign up!") 

、次のようにフラスコ-WTFを使用して、私のSignupFormを作成します。

from flask import Flask, render_template, request, session, redirect, url_for, flash 
from forms import SignupForm 
import database_methods 

app = Flask(__name__) 
app.secret_key = "development key" 

@app.route('/signup', methods=["GET", "POST"]) 
def signup(): 
    """ Signs a user up for an account so that they may log in """ 
    form = SignupForm() 

    if request.method == 'POST': 
     if not form.validate(): # ensure that a user enters all fields correctly 
      return render_template('signup.html', form=form) 
     else: 
      username = form.username.data 
      first_name = form.first_name.data 
      last_name = form.last_name.data 
      email = form.email.data 
      password = form.password.data 
      database_methods.insert_row_in_db(username, first_name, last_name, email, password) 

      return "All right! Signed up!" 

    elif request.method == 'GET': 
     return render_template('signup.html', form=form) 

最後に、ユーザーがフォームに入力したデータを挿入する実際の方法があります。

import sqlite3 
import os 
from werkzeug.security import generate_password_hash 
from uuid import uuid4 

BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 
DB_PATH = os.path.join(BASE_DIR, "chat.sqlite") 


def insert_row_in_db(username, firstname, lastname, email, password): 
    """ Creates a row in chat.sqlite's users table """ 
    uid = uuid4().hex 
    pwd_hash = generate_password_hash(password) 
    login_time = set_lastlogin(uid) 
    row_data = (uid, username, firstname, lastname, email, pwd_hash, login_time, True) 

    with sqlite3.connect(DB_PATH) as conn: 
     c = conn.cursor() 
     c.execute('''INSERT INTO users (uid, username, firstname, lastname, email, passwordhash, 
        lastlogin, loggedin) VALUES (?, ?, ?, ?, ?, ?, ?, ?);''', row_data) 

参考のためにHTMLファイルが必要な場合は、ここにあります。

私は数時間前からグーグルグーグルであり、多くのことを無駄にしてきました。あなたが提供できるどんな助けも大いに感謝されるでしょう!

ありがとうございます! :)

+0

エラーが発生するか、insert_row_in_db()が正常に返されますか? – Vib

+0

私は間違いをしない。それは静かに失敗しています。 insert_row_in_db()を手動で実行すると、すべて正常に動作し、行がデータベースに追加されます。 – agaidis

+0

また、signup()では、username、first_name、last_nameなどの書式設定された文字列を返すだけで、これらの要素はWebページ上で完全に正常に表示されます。 – agaidis

答えて

0

私はDockerを使用しています。以前はこれまで使用していませんでした。私がPyCharmで使用していたものとは別のデータベースを作成していたことが判明しました。私のコードは実際に働いていました。ただ予想していたデータベースとは別のデータベースに追加していただけです。

0

問い合わせ後にcommitメソッドを呼び出すとどうでしょうか? Flaskドキュメントhttp://flask.pocoo.org/docs/0.12/patterns/sqlite3/#initial-schemasでは、このようにクエリを実行した後にコミットします。

def init_db(): 
    with app.app_context(): 
     db = get_db() 
     with app.open_resource('schema.sql', mode='r') as f: 
      db.cursor().executescript(f.read()) 
     db.commit() 

私はこれがあなたに役立つことを望みます。

+0

そして、アプリケーションの解読の後で文脈をクリアしようとしました – junsang

+0

私はコミットしようとしましたが、クリアしようとしましたが、両方ともdbに行を挿入できませんでした。私はそれがデフォルトで 'with sqlite3.connect ...:'行がコミットし成功した場合は接続を閉じるためだと思います。 – agaidis

+0

データベースを初期化する限り、私は既にデータベースを初期化しています(私はPyCharmを使用しているため、初期化は非常に簡単です)。 – agaidis

関連する問題