Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Flask:在数据库中保存聊天信息_Javascript_Python_Html_Flask - Fatal编程技术网

Javascript Flask:在数据库中保存聊天信息

Javascript Flask:在数据库中保存聊天信息,javascript,python,html,flask,Javascript,Python,Html,Flask,因此,我正在向我的网站添加聊天记录。为了做到这一点,我必须首先将消息和房间id保存在一个单独的类中。但是,由于某种原因,我在尝试保存这些消息时出错。有人能告诉我如何保存邮件而不出错吗?我已经把代码放在下面了。非常感谢。我之所以这么做,是因为我的另一个问题提供了解决方案。因此,如果您没有发现这方面的任何问题,请转到此处查看我的问题和提供的答案,以便进一步澄清 main.py from flask import Flask, request, session, render_template

因此,我正在向我的网站添加聊天记录。为了做到这一点,我必须首先将消息和房间id保存在一个单独的类中。但是,由于某种原因,我在尝试保存这些消息时出错。有人能告诉我如何保存邮件而不出错吗?我已经把代码放在下面了。非常感谢。我之所以这么做,是因为我的另一个问题提供了解决方案。因此,如果您没有发现这方面的任何问题,请转到此处查看我的问题和提供的答案,以便进一步澄清

main.py

    from flask import Flask, request, session, render_template, redirect, url_for, flash, get_flashed_messages, jsonify
    from flask.globals import current_app
    from flask_login import LoginManager, login_user, login_required, logout_user, current_user, UserMixin, AnonymousUserMixin
    from datetime import timedelta, datetime
    from werkzeug.security import generate_password_hash, check_password_hash
    import sqlite3
    from os import error, path
    from flask_sqlalchemy import SQLAlchemy
    import random
    from flask_socketio import SocketIO, join_room, leave_room, emit
    from flask_session import Session

    app = Flask(__name__)
    DB_NAME = "spark.db"
    app.config["SECRET_KEY"] = "1986319249872139865432"
    app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{DB_NAME}"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config['SESSION_TYPE'] = 'filesystem'


    Session(app)

    socketio = SocketIO(app, manage_session=False)

    db = SQLAlchemy(app)
    db.init_app(app)

    def create_database(app):
        if not path.exists(DB_NAME):
            db.create_all(app=app)
            print("Created Database!")

    class Tutor(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
        tremail = db.Column(db.String(10000))
        trusername = db.Column(db.String(1200))
        subjects = db.Column(db.String(1200))
        session_length = db.Column(db.String(1200))

    class Messages(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        room_id = db.Column(db.String(1200), unique=True, nullable=False)
        content = db.Column(db.String(10000))

    class User(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(150), unique=True)
        username = db.Column(db.String(150), unique=True)
        password = db.Column(db.String(150))
        tutors = db.relationship('Tutor')


    create_database(app)

    login_manager = LoginManager()
    login_manager.login_view = 'login'
    login_manager.init_app(app)
    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))


    @app.route("/")
    @login_required
    def home():
        return render_template("index.html")

    @app.route("/login", methods=["GET", 'POST'])
    def login():
        if request.method == "POST":
            email = request.form.get('email')
            password = request.form.get('password')

            user = User.query.filter_by(email=email).first()
            if user:
                if check_password_hash(user.password, password):
                    flash('Login successful!', category="success")
                    login_user(user, remember=True)
                    return redirect(url_for("home"))
                else:
                    flash('Incorrect password! Please try again.', category="error")
            else:
                flash("Account does not exist. Please register to continue.", category="error")


        return render_template("login.html", user=current_user)

    @app.route("/register", methods=["GET", "POST"])
    def register():
        if request.method == 'POST':
            email = request.form.get('email')
            username = request.form.get('username')
            password1 = request.form.get('password1')
            password2 = request.form.get('password2')

            user = User.query.filter_by(email=email).first()
            if user:
                flash("Email already exists.", category="error")
            elif len(email) < 4:
                flash("Email must be greater than 3 characters.", category="error")
            elif len(username) < 2:
                flash("Username must be greater than 1 character.", category="error")
            elif password1 != password2:
                flash("Passwords do not match! Please try again.", category="error")
            elif len(password1) < 8:
                flash("Password must be greater than 7 characters.", category="error")
            else:
                new_user = User(email=email, username=username, password=generate_password_hash(password1, method='sha256'))
                db.session.add(new_user)
                db.session.commit()
                login_user(new_user, remember=True)
                flash("Account successfully created!", category="success")

                return redirect(url_for('home'))

        return render_template("register.html", user=current_user)

    @app.route("/logout")
    @login_required
    def logout():
        logout_user()
        flash("Logged out succcessfully!", category="success")
        return redirect(url_for('login'))

    @app.route("/selection")
    @login_required
    def selection():
        return render_template("selection.html")

    @app.route("/tutorform", methods=['GET', 'POST'])
    @login_required
    def tutorform():
        if request.method == 'POST':
            email = request.form.get('email')
            tremail = request.form.get('tremail')
            trusername = request.form.get('trusername')
            subjects = request.form.get('subjects')
            session_length = request.form.get('session_length')

            new_tutor = Tutor(user_id=current_user.id, tremail=tremail, trusername=trusername, subjects=subjects, session_length=session_length)
            db.session.add(new_tutor)
            db.session.commit()
            flash('Entry has been saved!', category='success')
            return redirect(url_for("display"))

        return render_template("tutorform.html", user=current_user)

    @app.route("/tutoreeform", methods=['GET', 'POST'])
    @login_required
    def tutoreeform():
        if request.method == 'POST':
            flash("Tutoree Entry Successful!", category='success')
            return redirect(url_for("display"))

        return render_template("tutoreeform.html")

    @app.route("/display")
    @login_required
    def display():
        users = Tutor.query.all()

        return render_template("display.html", users=users)

    @login_required
    @app.route('/chat', methods=['GET', 'POST'])
    def chat():
        if(request.method=='POST'):
            username = current_user.username
            room = request.form['room']
            #Store the data in session
            session['username'] = username
            session['room'] = room
            return render_template('chat.html', session = session)
        else:
            if(current_user.username is not None):
                return render_template('chat.html', session = session)
            else:
                return redirect(url_for('chatselection'))

    class Anonymous(AnonymousUserMixin):
    def __init__(self):
        self.username = 'Guest'

    @socketio.on('join', namespace='/chat')
    @login_required
    def join(message):
        room = session.get('room')
        join_room(room)
        emit('status', {'msg': current_user.username + ' has entered the room.'}, room=room)


    @socketio.on('text', namespace='/chat')
    @login_required
    def text(message):
        room = session.get('room')

        message = Messages(room_id=room, content=message)
        db.session.add(message)
        db.session.commit()
        emit('message', {'msg': session.get('username') + ' : ' + message['msg']}, room=room)

    @socketio.on('left', namespace='/chat')
    @login_required
    def left(message):
        room = session.get('room')
        leave_room(room)
        session.clear()
        emit('status', {'msg': current_user.username + ' has left the room.'}, room=room)

    @app.route("/chatselection", methods=['GET', 'POST'])
    def chatselection():
        return render_template("chatselection.html")


    if __name__ == '__main__':
        db.create_all()
        socketio.run(app, debug=True)

由于您没有提供最低限度的代码()来测试它,我只能帮助您在哪里检查问题

根据您的代码,您的房间id是:
room\u id=db.Column(db.String(1200),unique=True,nullable=False)

但当您执行代码时,消息中的变量可能不同

room = session.get('room') # HERE CHECK room_id type, what is the type of room here?
message = Messages(room_id=room, content=message)
db.session.add(message)
db.session.commit()

如果
room\u id
没有问题,请检查数据库中的所有变量及其类型。

最好共享
login.html
文件或测试代码所需的任何文件。请检查
room\u id
,它可能没有正确的类型。请您解释一下正确的房间类型是什么意思?它是字符串还是非字符串?通过执行来检查它。它可能有一个你没有预料到的不同。
{% extends "base.html" %}
{% block title %}SparkWIT | | Chat Selection{% endblock %}

{% block content %}

<center><h1 class="h2 mb-3 font-weight-normal" style="color: beige;">SparkWIT Babbles</h1><br><br></center>
<br>
<hr>
  <form class="form-signin" action="{{url_for('chat')}}" method="POST">
    <input type="text" id="room" name="room" class="form-control" placeholder="Room Code" required><br>
    <button class="btn btn-lg btn-primary btn-block" value="submit">Create/Join Room</button>
  </form>
<br>


{% endblock %}
    <!DOCTYPE html>
    <html>
        <head>
            <title >{% block title %}{% endblock %}</title>
            <link rel= "stylesheet" type= "text/css" href= "{{ url_for('static',filename='style.css') }}">
            <link rel= "stylesheet" type= "text/css" href= "{{ url_for('static',filename='bootstrap.min.css') }}">
            <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

            <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>

    <!-- Bootstrap core JavaScript -->
            <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

    <!-- Plugin JavaScript -->
            <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
            <script src="https://cdn.jsdelivr.net/npm/startbootstrap-stylish-portfolio@5.0.9/js/stylish-portfolio.min.js"></script>

            <script type="text/javascript" src="//code.jquery.com/jquery-1.4.2.min.js"></script>
            <script src="https://cdn.socket.io/3.1.3/socket.io.min.js" integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh" crossorigin="anonymous"></script>
            <script type="text/javascript" charset="utf-8">
                var socket;
                $(document).ready(function(){
                    socket = io.connect('http://' + document.domain + ':' + location.port + '/chat');
                    socket.on('connect', function() {
                        socket.emit('join', {});
                    });
                    socket.on('status', function(data) {
                        $('#chat').val($('#chat').val() + '<' + data.msg + '>\n');
                        $('#chat').scrollTop($('#chat')[0].scrollHeight);
                    });
                    socket.on('message', function(data) {
                        $('#chat').val($('#chat').val() + data.msg + '\n');
                        $('#chat').scrollTop($('#chat')[0].scrollHeight);
                    });
                    $('#send').click(function(e) {
                            text = $('#text').val();
                            $('#text').val('');
                            socket.emit('text', {msg: text});
                    });
                });
                function leave_room() {
                    socket.emit('left', {}, function() {
                        socket.disconnect();
                        // go back to the login page
                        window.location.href = "{{ url_for('display') }}";
                    });
                }
            </script>

        </head>
        <body style="background-image: url(https://media.istockphoto.com/photos/abstract-glittering-dna-helix-with-depth-of-field-over-dark-space-picture-id1201193016?k=6&m=1201193016&s=612x612&w=0&h=_H80RaLa4OYIiT136j_cFgm-YRHAiV4wmaSkSKAMFbQ=)">
            <nav class="navbar navbar-expand-lg navbar-dark" style="background-color: #549bf773;">
                <a class="navbar-brand" href="/">
                    <img src="{{url_for('static', filename='logo.jpg')}}" alt="" width="40">
                </a>
                <a class="navbar-brand" href="/" style="color: rgb(22, 9, 3);"><i><b style="font-family: fantasy; font-size: larger;">SparkWIT</b></i></a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
                </button>

                {% if current_user.is_authenticated %}
                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <ul class="navbar-nav mr-auto">
                    <li class="nav-item active">
                        <a class="nav-link" href="/" style="color: rgb(37, 20, 13);"><b><i>Home</i></b> <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item active">
                        <a class="nav-link" href="/selection" style="color: rgb(37, 20, 13);"><b><i>Selection</i></b> <span class="sr-only">(current)</span></a>
                    </li>
                    </ul>
                    <a class="nav-link" href="/logout"><button type="button" class="btn btn-outline-danger" style="color: rgb(0, 0, 0);"><b>Logout</b></button></a>
                {% else %}

                    <a class="nav-link" href="/login"><button type="button" class="btn btn-outline-light"><b>Login</b></button></a>
                    <a class="nav-link" href="/register"><button type="button" class="btn btn-outline-warning"><b>Register</b></button></a>
                {% endif %}
                </div>
            </nav>

                    {% with messages = get_flashed_messages(with_categories=true) %}
            {% if messages %}
                {% for category, message in messages %}
                {% if category == "error" %}
                <div class="alert alert-danger alter-dismissable fade show" role="alert">
                    {{ message }}
                    <button type="button" class="close" data-dismiss="alert">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                {% endif %}
                {% if category == "success" %}
                <div class="alert alert-success alter-dismissable fade show" role="alert">
                    {{ message }}
                    <button type="button" class="close" data-dismiss="alert">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                {% endif %}
                {% endfor %}
            {% endif %}
            {% endwith %}

            <div class="container">
                {% block content %}{% endblock %}
            </div>
            <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
            <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
        </body>
    </html>
    Exception in thread Thread-32:
    Traceback (most recent call last):
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1276, in _execute_context       
        self.dialect.do_execute(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\default.py", line 593, in do_execute
        cursor.execute(statement, parameters)
    sqlite3.InterfaceError: Error binding parameter 1 - probably unsupported type.

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
    File "D:\Everyday_Uses\lib\threading.py", line 954, in _bootstrap_inner
        self.run()
    File "D:\Everyday_Uses\lib\threading.py", line 892, in run
        self._target(*self._args, **self._kwargs)
    File "D:\Everyday_Uses\lib\site-packages\socketio\server.py", line 680, in _handle_event_internal
        r = server._trigger_event(data[0], namespace, sid, *data[1:])
    File "D:\Everyday_Uses\lib\site-packages\socketio\server.py", line 704, in _trigger_event
        return self.handlers[namespace][event](*args)
    File "D:\Everyday_Uses\lib\site-packages\flask_socketio\__init__.py", line 283, in _handler
        return self._handle_event(handler, message, namespace, sid,
    File "D:\Everyday_Uses\lib\site-packages\flask_socketio\__init__.py", line 751, in _handle_event
        ret = handler(*args)
    File "D:\Everyday_Uses\lib\site-packages\flask_login\utils.py", line 272, in decorated_view
        return func(*args, **kwargs)
    File "d:\Everyday_Uses\Programming\SparkWIT\main.py", line 200, in text
        db.session.commit()
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\scoping.py", line 163, in do
        return getattr(self.registry(), name)(*args, **kwargs)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 1042, in commit
        self.transaction.commit()
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 504, in commit
        self._prepare_impl()
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 483, in _prepare_impl
        self.session.flush()
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 2536, in flush
        self._flush(objects)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 2678, in _flush
        transaction.rollback(_capture_exception=True)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__
        compat.raise_(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
        raise exception
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\session.py", line 2638, in _flush
        flush_context.execute()
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
        rec.execute(self)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\unitofwork.py", line 586, in execute
        persistence.save_obj(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\persistence.py", line 239, in save_obj
        _emit_insert_statements(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\orm\persistence.py", line 1135, in _emit_insert_statements
        result = cached_connections[connection].execute(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1011, in execute
        return meth(self, multiparams, params)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection 
        return connection._execute_clauseelement(self, multiparams, params)
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1124, in _execute_clauseelement 
        ret = self._execute_context(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1316, in _execute_context       
        self._handle_dbapi_exception(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1510, in _handle_dbapi_exception    util.raise_(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
        raise exception
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\base.py", line 1276, in _execute_context
        self.dialect.do_execute(
    File "C:\Users\aarya\AppData\Roaming\Python\Python39\site-packages\sqlalchemy\engine\default.py", line 593, in do_execute
        cursor.execute(statement, parameters)
    sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 1 - probably unsupported type.
    [SQL: INSERT INTO messages (room_id, content) VALUES (?, ?)]
    [parameters: ('test', {'msg': 'gsefasd'})]
    (Background on this error at: http://sqlalche.me/e/13/rvf5)
room = session.get('room') # HERE CHECK room_id type, what is the type of room here?
message = Messages(room_id=room, content=message)
db.session.add(message)
db.session.commit()