開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Python 3.6 (プログラミング言語)
Head First Python (Paul Barry (著)、O'Reilly Media)のChapter 12.(113/4 A Little Bit of Threading: Dealing With Waiting) の SHARPEN YOUR PENCIL(No. 8630) を取り組んでみる。
SHARPEN YOUR PENCIL(No. 8630)
コード(Emacs)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # cursor.execute('''create table log ( # id int auto_increment primary key, # ts timestamp default current_timestamp, # phrase varchar(128) not null, # letters varchar(32) not null, # ip varchar(16) not null, # browser_string varchar(256) not null, # results varchar(64) not null )''') from flask import Flask, render_template, request, escape from DBcm import UseDatabase, CustomException from threading import Thread import sqlite3 import vsearch app = Flask(__name__) app.config['dbconfig'] = {'host': '127.0.0.1', 'user': 'vsearch', 'password': 'vsearchpasswd', 'database': 'vsearchlogDB'} def log_request(req: 'flask_request', res: str) -> None: # with UseDatabase(app.config['dbconfig']) as cursor: with UseDatabase(app.config['dbconfig']) as cursor: _SQL = '''insert into log (phrase, letters, ip, browser_string, results) values (?, ?, ?, ?, ?)''' cursor.execute(_SQL, (req.form['phrase'], req.form['letters'], req.remote_addr, req.user_agent.browser, res)) @app.route('/') @app.route('/entry') def entr_page() -> 'html': return render_template('entry.html', the_title='Welcome to search4letters on the web!') @app.route('/search4', methods=['POST']) def do_search() -> 'html': phrase = request.form['phrase'] letters = request.form['letters'] title = 'Here are your result:' results = str(vsearch.search4letters(phrase, letters)) try: t = Thread(target=log_request, args=(request, results)) t.start() except CustomException as err: print(err) except Exception as err: print(err) return render_template('results.html', the_title=title, the_phrase=phrase, the_letters=letters, the_results=results) @app.route('/viewlog') def view_the_log() -> 'html': with UseDatabase(app.config['dbconfig']) as cursor: _SQL = 'select phrase, letters, ip, browser_string, results from log' cursor.execute(_SQL) contents = cursor.fetchall() titles = ('Phrase', 'Letters', '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)
入出力結果(Terminal, IPython)
$ ./vsearch4log.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 873-014-066 127.0.0.1 - - [15/Apr/2017 16:45:34] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [15/Apr/2017 16:45:34] "GET /static/hf.css HTTP/1.1" 304 - 127.0.0.1 - - [15/Apr/2017 16:45:39] "POST /search4 HTTP/1.1" 200 - Exception in thread Thread-2: Traceback (most recent call last): File "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/threading.py", line 916, in _bootstrap_inner self.run() File "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "./vsearch4log.py", line 35, in log_request cursor.execute(_SQL, (req.form['phrase'], File "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__ return getattr(self._get_current_object(), name) File "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/werkzeug/local.py", line 306, in _get_current_object return self.__local() File "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/flask/globals.py", line 37, in _lookup_req_object raise RuntimeError(_request_ctx_err_msg) RuntimeError: Working outside of request context. This typically means that you attempted to use functionality that needed an active HTTP request. Consult the documentation on testing for information about how to avoid this problem. C-c C-c$
0 コメント:
コメントを投稿