

**前提・実現したいこと**  
PythonとHTMLテンプレートを使用して作ったウェブアプリのログを、  
MySQL上にテーブルを作って閲覧したいと思っています。

そこでPythonとMySQLを接続し、  
Pythonのコードを書き替えたら、  
ウェブアプリは表示されるのですが、  
検索機能を実行しようとすると、  
エラーが起きてしまいました...

発生している問題・エラーメッセージ

mysql.connector.errors.ProgrammingError  
mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user
'vsearch'@'localhost' (using password: YES)  
該当のソースコード  
変更前

[code]

    from flask import Flask, render_template, request, escape
    from vsearch import search4letters
    
    app = Flask(__name__)
    
    
    def log_request(req: 'flask_request', res: str) -> None:
        with open('vsearch.log', 'a') as log:
            print(req.form, req.remote_addr, req.user_agent, res, file=log, sep='|')
    
    
    @app.route('/search4', methods=['POST'])
    def do_search() -> 'html':
        phrase = request.form['phrase']
        letters = request.form['letters']
        title = 'Here are your results:'
        results = str(search4letters(phrase, letters))
        log_request(request, results)
        return render_template('results.html',
                               the_title=title,
                               the_phrase=phrase,
                               the_letters=letters,
                               the_results=results,)
    
    
    @app.route('/')
    @app.route('/entry')
    def entry_page() -> 'html':
        return render_template('entry.html',
                               the_title='Welcome to search4letters on the web!')
    
    
    @app.route('/viewlog')
    def view_the_log() -> 'html':
        contents = []
        with open('vsearch.log') as log:
            for line in log:
                contents.append([])
                for item in line.split('|'):
                    contents[-1].append(escape(item))
        titles = ('Form Data', 'Remote_addr', 'User_agent', 'Results')
        return render_template('viewlog.html',
                               the_title='View Log',
                               the_row_titles=titles,
                               the_data=contents,)
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
[/code]

変更後

[code]

    from flask import Flask, render_template, request, escape
    from vsearch import search4letters
    
    app = Flask(__name__)
    
    def log_request(req: 'flask_request', res: str) -> None:
        dbconfig = {'host': '127.0.0.1',
                    'user': 'vsearch',
                    'password': 'vsearchpasswd',
                    'database': 'vsearchlogDB',}
        import mysql.connector
        conn = mysql.connector.connect(**dbconfig)
        cursor = conn.cursor()
    
        _SQL = """insert into log
                  (phrase, letters, ip, browser_string, results)
                  values
                  (%s, %s, %s, %s, %s)"""
        cursor.execute(_SQL, (req.form['phrase'],
                              req.form['letters'],
                               req.remote_addr,
                               req.user_agent.browser,
                               res,))
        conn.commit()
        curosr.close()
        conn.close()
    
    
    @app.route('/search4', methods=['POST'])
    def do_search() -> 'html':
        phrase = request.form['phrase']
        letters = request.form['letters']
        title = 'Here are your results:'
        results = str(search4letters(phrase, letters))
        log_request(request, results)
        return render_template('results.html',
                               the_title=title,
                               the_phrase=phrase,
                               the_letters=letters,
                               the_results=results,)
    
    
    @app.route('/')
    @app.route('/entry')
    def entry_page() -> 'html':
        """Display this webapp's HTML form."""
        return render_template('entry.html',
                               the_title='Welcome to search4letters on the web!')
    
    
    @app.route('/viewlog')
    def view_the_log() -> 'html':
        """Display the contents of the log file as a HTML table."""
        contents = []
        with open('vsearch.log') as log:
            for line in log:
                contents.append([])
                for item in line.split('|'):
                    contents[-1].append(escape(item))
        titles = ('Form Data', 'Remote_addr', 'User_agent', 'Results')
        return render_template('viewlog.html',
                               the_title='View Log',
                               the_row_titles=titles,
                               the_data=contents,)
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
[/code]

_MySQL_

[code]

    create user '***'@'####' identified by '????';
    grant all privileges on vsearchlogDB.* to '***'@'####';
    
[/code]

**試したこと**  
[参考にしたページ][1]  
アクセスが拒否されたとき  
上のウェブサイトを参考に  
復旧を試みましたが  
ダメでした....

補足情報（FW/ツールのバージョンなど）  
Python 3.7 (64 bit)  
MySQL 8.0  
使用教材 『Head First Python』O'Reilly Japan

よろしくお願いいたします。


CC BY-SA 4.0
2019-06-20T03:40:31.083
55932
2019-06-20T03:40:31.083
34773
question
python html mysql
PythonとMySQLを接続したら、ウェブアプリが作動しなくなった