開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Python 3.6 (プログラミング言語)
Head First Python (Paul Barry (著)、O'Reilly Media)のChapter 11.(Exception Handling: What to Do When Things Go Wrong) の SHARPEN YOUR PENCIL(No. 8290) を取り組んでみる。
SHARPEN YOUR PENCIL(No. 8290)
コード(Emacs)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sqlite3 class CustomException(Exception): pass class UseDatabase: def __init__(self, dbconfig: dict) -> None: self.dbconfig = dbconfig def __enter__(self) -> 'cursor': try: self.conn = sqlite3.connect(self.dbconfig['database'] + '.sql') self.cursor = self.conn.cursor() return self.cursor except Exception as err: raise CustomException('custom exception') def __exit__(self, exc_type, exc_value, exc_trace) -> None: self.conn.commit() self.cursor.close() self.conn.close() if __name__ == '__main__': dbconfig = {'host': '127.0.0.1', 'user': 'vsearch', 'password': 'vsearchpasswd', 'database': 'vsearchlogDB'} with UseDatabase() as cursor: _SQL = '''select * from log''' cursor.execute(_SQL) for row in cursor.fetchall(): print(row)
#!/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 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('') 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: log_request(request, results) 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 - - [14/Apr/2017 14:08:04] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [14/Apr/2017 14:08:04] "GET /static/hf.css HTTP/1.1" 304 - custom exception 127.0.0.1 - - [14/Apr/2017 14:08:10] "POST /search4 HTTP/1.1" 200 - C-c C-c $
0 コメント:
コメントを投稿