diff options
-rw-r--r-- | LectureNotesOnPython.rst | 151 |
1 files changed, 148 insertions, 3 deletions
diff --git a/LectureNotesOnPython.rst b/LectureNotesOnPython.rst index eebb243..cd99d08 100644 --- a/LectureNotesOnPython.rst +++ b/LectureNotesOnPython.rst @@ -5,7 +5,7 @@ Lecture Notes on Python :Authors: 蓝珲 (lanhui AT zjnu.edu.cn) -:Version: 0.1.2 of 2019-04-14 +:Version: 0.1.3 of 2019-05-27 @@ -2042,7 +2042,9 @@ IS-A 。 一手牌是一副牌。 hand.move_cards(deck, 5) -用于数据库操作。以 SQLite 为例子。 +.. _UseSqlite.py: + +用于数据库操作。以 SQLite 为例子 (UseSqlite.py)。 .. code:: python @@ -2108,11 +2110,154 @@ IS-A 。 一手牌是一副牌。 web 应用程序 ```````````` +我们将使用 Flask 这个 Python 微型框架来实现网页应用程序。 在文本框输入文本 `````````````````````````````````````````````````` -school.py +利用 Flask 库中的 request 实现前端与后端的信息传递。 + +前端是网页, 我们需要形成一个网页 (静态的, 动态的, 手工写的, 模版 +形成的)。 我们在前端的文本框中输入数据, 希望把数据传给后端的 Python +程序处理。 如何实现这一点? 靠 request 。 用 from flask import +Flask, request 先把 request 这个模块引入。 + + +.. code:: html + + <p><b>Enter a risk ...</b></p> + <form method="post" action="/enter"> + <p>Company name:<br/><input name="company_name"/></p> + <p>Serial number:<br/><input name="serial_number"/></p> + <p>Risk detail:<br/><input name="risk_detail"/></p> + <input type="submit" value="Enter"/> + <input type="reset" value="Clear"/> + </form> + + +以上这段存成一个html文件, 注意到这里我们没有涉及到任何python代码, 打 +开就是一个表格, 当我们点击按钮 Enter 后, 在程序运行时, 输入框 +company_name, serial_number, risk_detail 中的信息会被 request.form 存 +储。 在Python程序中可以用 request.form['companay_name'] 来得到用户实际 +在文本框中输入的信息。 信息可小可大, 小的比如一个数字, 大的比如一段 +文本。 信息一旦提取, 我们就像平时在非网络环境下一样, 处理这段信息。 + +解释 method="post" 。 + +解释 action="/enter" 。 + +以下是完整的程序 risk.py , 特别注意 enter() 那个函数。 UseSqlite 模块已经 +由上文 `UseSqlite.py`_ 定义。 在命令行输入 python risk.py 然后在 +Firefox打开 127.0.0.1:5000 这个网址即可运行。 + +在 Firefox 地址栏输入 127.0.0.1:5000/enter 这个地址并按回车键时, 就会 +运行 enter() 中 else 那段代码, 这叫 GET 一个网页, 其实就是返回了一个 +有html tag的字符串给 Firefox, 以便 Firefox 正确显示。 在按下 Enter 按 +钮后, 就会运行 enter() 中 if 那段代码, 这是 POST 一个网页后执行的操 +作, 添加数据到数据库中。 + +.. code:: python + + from flask import Flask, request + from UseSqlite import InsertQuery, RiskQuery + from datetime import datetime + import json + + app = Flask(__name__) + + + def make_html_table_row(s): + lst = s.split(',') + index = s.find('{') + result = '<tr>' + result += '<td><b>%s</b></td>' % (lst[0]) + for x in lst[1:3]: + result += '<td>%s</td>' % (x) + result += '<td>%s</td>' % (s[index:].replace(' ', ' ').replace('\n', '<br/>')) + return result + '</tr>' + + + def get_database_records(): + rq = RiskQuery('RiskDB.db') + rq.instructions("SELECT * FROM inspection WHERE inspection_serial_number LIKE 'RI%'") + rq.do() + record = '<p><i>Risk information for all companies</i></p><table border=0>\n' + for r in rq.format_results().split('\n\n'): + record += '%s' % (make_html_table_row(r)) + return record + '</table>\n' + + + def narrow_database_records(s): + rq = RiskQuery('RiskDB.db') + rq.instructions("SELECT * FROM inspection WHERE company_name LIKE '%%%s%%' OR risk_detail LIKE '%%%s%%' " % (s, s)) + rq.do() + lst = rq.format_results().split('\n\n') + if lst[0].strip() == '': + return 'Nothing found :(' + record = '\n<table border=0>\n' + for r in lst: + record += '%s\n' % (make_html_table_row(r)) + return record + '</table>\n' + + + @app.route("/search", methods=['GET', 'POST']) + def search(): + if request.method == 'POST': # when we submit a form + search_keywords = request.form['keywords'] + page = narrow_database_records(search_keywords) + return page + else: # when we load a html page + page = '<p><b>Search risks ...</b></p>' + page += '<form method="post" action="/search">' + page += ' <input name="keywords"/>' + page += ' <input type="submit" value="Enter"/>' + page += '</form>' + return page + + + @app.route("/enter", methods=['GET', 'POST']) + def enter(): + if request.method == 'POST': # when we submit a form + company_name = request.form['company_name'] + if company_name == '': + return 'Company name required.' + serial_number = request.form['serial_number'] + if serial_number == '': + return 'Serial number required.' + risk_detail = request.form['risk_detail'] + if risk_detail == '': + return 'Risk_detail information required.' + + date = datetime.now().strftime('%Y-%m-%d') + iq = InsertQuery('RiskDB.db') + iq.instructions("INSERT INTO inspection Values ('%s', '%s', '%s', '%s')" % (company_name, serial_number, date, risk_detail)) + iq.do() + + return '<p>You have entered the following information:</p><p>%s - %s - %s</p><br/><a href="/">Return</a>' % (company_name, serial_number, risk_detail) + else: # when we load a html page + page = '<p><b>Enter a risk ...</b></p>\n' + page += '<form method="post" action="/enter">\n' + page += ' <p>Company name:<br/><input name="company_name"/></p>\n' + page += ' <p>Serial number:<br/><input name="serial_number"/></p>\n' + page += ' <p>Risk detail:<br/><input name="risk_detail"/></p>\n' + page += ' <input type="submit" value="Enter"/>\n' + page += ' <input type="reset" value="Clear"/>\n' + page += '</form>' + return page + + + @app.route("/") + def mainpage(): + page = '<p><a href="/enter">Enter a risk</a></p>' + page += '<p><a href="/search">Search risks</a></p>' + page += get_database_records() + return page + + + if __name__ == '__main__': + app.run(debug=True) + + 上传文件 |