summaryrefslogtreecommitdiff
path: root/LectureNotesOnPython.rst
diff options
context:
space:
mode:
authorHui Lan <lanhui@zjnu.edu.cn>2019-05-27 08:59:21 +0800
committerHui Lan <lanhui@zjnu.edu.cn>2019-05-27 08:59:21 +0800
commit7c78ebe64b0a04261691ebf6336fad6348e276c7 (patch)
treebb9b01d0c251954fa3925b068374760e30c70e3d /LectureNotesOnPython.rst
parentdfe3585459882f1e168e9e4f2242e7d0759a9824 (diff)
在web应用程序这节加入了“在文本框输入文本”这小节
做了一个提交表格信息到后端python程序的例子, risk.py。
Diffstat (limited to 'LectureNotesOnPython.rst')
-rw-r--r--LectureNotesOnPython.rst151
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(' ', '&nbsp;').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)
+
+
上传文件