Цикл в словаре не работает в Python-Flask-HTML

Я пытаюсь создать словарь с использованием Python-Flask-HTML, который перебирает каждый символ, полученный из формы ввода HTML, и возвращает соответствующие значения на выходе. Например:

ввод: Z.123/46X/78; выход: Y-BCD+EFW+HI

Код Python-фласка:

from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime


app = Flask(__name__)


app.config['TEMPLATES_AUTO_RELOAD'] = True

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)


class mydict(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return '<Value %r>' % self.id



@app.route('/', methods=['POST','GET'])
def dictionary():

    result = ''

    definition = {'0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G', '7': 'H', '8': 'I', '9': 'J',
               'Z': 'Y', 'X': 'W', '/': '+', '.': '-'}


    if request.method == 'POST':
        dict_content = request.form['content']
        for num in dict_content:  
            result += definition[num]  
            new_content = mydict(content=result)

            try:    
                db.session.add(new_content)
                db.session.commit()
                return redirect('/')
            except:
                return 'error '
    else:     
        new_content = mydict.query.order_by(mydict.date_created).all()
        return render_template('index.html', new_content=new_content)



@app.route('/delete/<int:id>')     
def delete(id):
    value_to_delete = mydict.query.get_or_404(id)

    try:
        db.session.delete(value_to_delete)
        db.session.commit()
        return redirect('/')     
    except:
        return 'there was a prob deleting the value'



db.create_all()

if __name__ == "__main__":
    app.run(debug=True)

HTML-код словаря:

{% extends 'base.html' %}

{% block head %}
<title>Dictionary</title>
{% endblock %}

{% block body %}
<div class = "content">

    <h1 style = "text-align: center">Dictionary</h1>
    <table>
        <tr>
            <th>Definition</th>
            <th>Added</th>
            <th>Actions</th>
        </tr>
        {% for Value in new_content %}
            <tr>
                <td>{{ Value.content }}</td>
                <td>{{ Value.date_created.date() }}</td>
                <td>
                    <a href = "/delete/{{Value.id}}">Delete</a>
                </td>
        {% endfor %}
            </tr>
    </table>


    <div class = "form">
    <form action = "/" method = "POST">
        <input pattern = "[A-Z./]+" type = "number" name = "content" id = "content">
        <input type = "submit" value = "Enter Num">
    </form>
    </div>
</div>
{% endblock %}

Базовый HTML-код:

<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <link rel = "stylesheet" href = "{{ url_for('static', filename='css/main.css') }}">
    {% block head %}{% endblock %}
</head>
<body>
    {% block body %}{% endblock %}
</body>
</html>

С помощью приведенного выше кода я могу ввести несколько целых чисел, и на выходе будет только одна буква. Если я возьму словарную часть кода из приложения Python и запущу ее в Pycharm без остального кода, то смогу получить желаемый результат.

Кроме того, есть ли способ заставить ввод HTML принимать комбинацию цифр, букв и специальных символов? В настоящее время я использую input pattern = "[A-Z./]+" type = "number" , но, похоже, это не работает. Ваша помощь будет принята с благодарностью.

Может быть, ваш пример пары ввода-вывода неверен? В вашем словаре определений 1 связан с B, а не с A.

MacOS 23.12.2020 10:50

Привет @MacOS, это опечатка. Я поправлю это прямо сейчас.

MajorLazer 23.12.2020 12:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
447
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть несколько проблем в вашем коде.

Тип ввода

<input pattern = "[A-Z./]+" type = "number" name = "content" id = "content">

Здесь вы указываете, что принимаете только число. Это также причина, по которой ваш pattern не работает, когда вы пишете I'm currently using input pattern = "[A-Z./]+" type = "number" , but this doesn't seem to work.. Но, если я вас правильно понял, вы хотите, чтобы пользователь мог ввести строку, то есть сочетание букв и цифр, как вы указываете их оба в своем словаре. Поэтому вы должны изменить это на

<input type = "text" name = "content" id = "content">

Эта проблема, конечно же, связана с вашим вопросом Moreover, is there a way to get the HTML input to accept a combination of numbers, letters and special characters?. И ответ на этот вопрос - да. Но я не уверен, как должен выглядеть ваш шаблон. Это то, что вы ищите?

<input pattern = "[\D|\d][.|/][\D|\d]{3}[.|/][\D|\d]{3}[.|/][\D|\d]{2}" type = "text" name = "content" id = "content">

Перенаправить не туда

Кроме того, вы должны переместить оператор возврата в блок кода, где вы обрабатываете почтовый запрос. Это причина того, что вы возвращаете одну букву, поскольку приложение просто перенаправляет вас в / после того, как оно обработало первый элемент ввода.

    if request.method == 'POST':
        dict_content = request.form['content']
        app.logger.info(dict_content)
        for num in dict_content:
                app.logger.info(num)  
                result += definition[num]  
                new_content = mydict(content=result)

                try:    
                    db.session.add(new_content)
                    db.session.commit()
                except:
                    return 'error '

        return redirect('/')
    else:     
        new_content = mydict.query.order_by(mydict.date_created).all()
        return render_template('index.html', new_content=new_content)

Внешний вид

Однако это приводит к другой проблеме с тем, как она отображается.

Это вызвано тем, как вы обрабатываете сохранение в БД. С этого момента я больше не могу вам помочь, потому что я не знаю, как вы собираетесь это работать.

Предложение по улучшению кода

Тем не менее, вы можете просто сделать list(my_string), если ваш ввод представляет собой простую строку. Это вернет элементы строки в виде списка символов.

my_string = "Z.123/46X/78"
characters = list(my_string)
characters
>> ['Z', '.', '1', '2', '3', '/', '4', '6', 'X', '/', '7', '8']

Затем вы можете использовать свой словарь definition, чтобы заменить символы на

characters_exchanged = [definition[character] for character in characters]
characters_exchanged
>> ['Y', '-', 'B', 'C', 'D', '+', 'E', 'G', 'W', '+', 'H', 'I']

Наконец, вы можете объединить записи списка обратно в строку с помощью

my_string_exchanged = ''.join(characters_exchanged)
my_string_exchanged
>> 'Y-BCD+EGW+HI'

Возможно, вы захотите подумать о том, чтобы переписать свой код таким образом.

Собираем это вместе

Последней функцией для маршрута / может быть

@app.route('/', methods=['POST','GET'])
def dictionary():

    if request.method == 'POST':

        def exchange_characters(string):
            character_mapping = {
                '0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G', '7': 'H', '8': 'I', '9': 'J',
                'Z': 'Y', 'X': 'W', '/': '+', '.': '-'
            }

            character_list = list(string)

            characters_exchanged = [character_mapping[character] for character in character_list]

            return ''.join(characters_exchanged)

        def save_todb(string):
            try:
                string = mydict(content=string)
                db.session.add(string)
                db.session.commit()

                return redirect("/")
            except:
                return 'error '

        string = request.form['content']
        app.logger.info(string)

        exchanged_characters = exchange_characters(string)

        response = save_todb(exchanged_characters) 
        return response
    else:     

        new_content = mydict.query.order_by(mydict.date_created).all()
        return render_template('index.html', new_content=new_content)

ХТН

Спасибо, вы спасатель! Изменение ввода на «текст» и положение оператора return решили проблемы. Каковы функции app.logger.info(dict_content) и app.logger.info(num)?

MajorLazer 23.12.2020 17:08

Я использовал эту функцию для регистрации того, что происходит. :)

MacOS 23.12.2020 17:10

Пожалуйста, рассмотрите возможность отметить мой вопрос как правильный ответ и дать ему голосование (даже если он еще не засчитан). Таким образом, другие могут легко определить правильное решение.

MacOS 23.12.2020 17:11

Я хотел бы попробовать ваше предложение. В какой строке я должен разместить ваш код? my_string = "Z.123/46X/78" <<могу ли я изменить это на my_string =request.form['content']?

MajorLazer 23.12.2020 17:34

@MajorLazer Я обновил свой ответ. Пожалуйста, посмотрите.

MacOS 02.01.2021 12:30

Привет @MacOS, твой код улучшает структуру кода! Не могли бы вы объяснить, почему, когда мы передаем строковый параметр в функцию def save_todb(string), функция не дает нам тот же строковый параметр в качестве вывода?

MajorLazer 13.01.2021 03:42

Потому что, вообще говоря, вам это не нужно, потому что функция только сохраняет строку в БД. Однако вы можете изменить эту логику, например. как я изменил его сейчас. Пожалуйста, взгляните на обновленный ответ.

MacOS 13.01.2021 09:43

Другие вопросы по теме