From 7c78ebe64b0a04261691ebf6336fad6348e276c7 Mon Sep 17 00:00:00 2001 From: Hui Lan Date: Mon, 27 May 2019 08:59:21 +0800 Subject: =?UTF-8?q?=E5=9C=A8web=E5=BA=94=E7=94=A8=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E8=BF=99=E8=8A=82=E5=8A=A0=E5=85=A5=E4=BA=86=E2=80=9C=E5=9C=A8?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E6=A1=86=E8=BE=93=E5=85=A5=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E2=80=9D=E8=BF=99=E5=B0=8F=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 做了一个提交表格信息到后端python程序的例子, risk.py。 --- LectureNotesOnPython.rst | 151 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file 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 + +

Enter a risk ...

+
+

Company name:

+

Serial number:

+

Risk detail:

+ + +
+ + +以上这段存成一个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 = '' + result += '%s' % (lst[0]) + for x in lst[1:3]: + result += '%s' % (x) + result += '%s' % (s[index:].replace(' ', ' ').replace('\n', '
')) + return result + '' + + + def get_database_records(): + rq = RiskQuery('RiskDB.db') + rq.instructions("SELECT * FROM inspection WHERE inspection_serial_number LIKE 'RI%'") + rq.do() + record = '

Risk information for all companies

\n' + for r in rq.format_results().split('\n\n'): + record += '%s' % (make_html_table_row(r)) + return record + '
\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\n' + for r in lst: + record += '%s\n' % (make_html_table_row(r)) + return record + '
\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 = '

Search risks ...

' + page += '
' + page += ' ' + page += ' ' + page += '
' + 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 '

You have entered the following information:

%s - %s - %s


Return' % (company_name, serial_number, risk_detail) + else: # when we load a html page + page = '

Enter a risk ...

\n' + page += '
\n' + page += '

Company name:

\n' + page += '

Serial number:

\n' + page += '

Risk detail:

\n' + page += ' \n' + page += ' \n' + page += '
' + return page + + + @app.route("/") + def mainpage(): + page = '

Enter a risk

' + page += '

Search risks

' + page += get_database_records() + return page + + + if __name__ == '__main__': + app.run(debug=True) + + 上传文件 -- cgit v1.2.1