Python构建web应用(进阶版)->对网页HTML优化逻辑显示

本篇是承载上同一首web应用(入门级)的始末为生顺延的,阅读后以见面询问HTML逻辑显示优化,如下图所著,从乱的日志文件及一个齐整的列表显示。

ca88官网 1

—————————————————————————— 我是分割线
—————————————————————————————————

6储存和管制数据

当底下的始末前面要了解存储和保管数据的学识。

有关web应用,应该记录每个web请求的数据。这样有利于分析这些题材:

曾经响应了有点只请求?最常用之假名列表是什么?请求来自哪个IP地址?哪个浏览器用之最好多?……

开辟、处理(process)和倒闭文件

 ca88官网 2

1.起一个txt空ca88官网文件(hh.txt),指定一个变量(a)打开这个文件,后面参数‘a’的含义是运用增加模式打开这个文件。open会返回一个流动,赋值给a变量

2.然晚打印消息到文件流。

3.好工作,最后关闭,文件流进行清理。

4.念是open的默认模式,所以无待提供模式参数,打开文件时按照待指定一个变量(read),然后open会返回一个文书流赋给read变量。

5.for循环每次循环读取一个数码实行,没有数量行即终止。

6.办事形成,关闭文件流进行清理。

 

顾模式:(r
w主要针对文本文件)

访问模式

说明

r

以只读方式打开文件,文件的指针会放在文件的开头。(默认模式)

w

以可写方式打开文件,文件存在时:覆盖,不存在时:创建新文件。

a

以追加方式打开文件,文件存在:指针放在文件结尾,不存在时:创建新文件进行写入。

rb

以二进制格式打开一个文件用于只读。

wb

以可读方式打开二进制文件。

ab

以追加方式打开二进制文件。

r+

打开一个文件用于读写,文件指针在开头。

rb+

 

wb+

以二进制格式打开一个文件用于只读。

ab+

 

x

打开一个新文件进行写数据,如果文件存在则失败。

上表没有写全,规律:r–read;
w–write; a–add to; b–binary; + –读写

 

采用with对文件操作

with open('hh.txt') as a:
  for chore in a:
    print(chore, end = ' ')

这般好做到与前的open相同之操作,并且后面不用close()关闭文件。这些情节是于Python内部生一个上下文管理协议,它就得了的办事,在用经常调用close。

事先提到的主次可以当增长内容了,我们想对这个web应用之数码进行仓储记录下来。

追思前的顺序内容:

ca88官网 3

以底下加加一个函数

def log_request(req: 'flask_request', res: str) -> None:
    with open('vsearch.log', 'a') as log:
        print(req, res, file=log)

调用这个函数时,req参数作为当下之flask请求对象,res参数作为调用vsearch_for_letters函数的结果.然后函数log_request把req和res的价加至一个称为也vsearch.log的文本。

下此函数时,我们添加到面的do_search中进行调用,当然在调用之前要定义函数,所以调整职务后底顺序如下:

 ca88官网 4

保存后在webapp文件夹着运作cmd,输入python
vsearch_for_web.py 

然后打开浏览器输入地点http://127.0.0.1:5000进行测试,试过几次之后会发现生成了一个log文件

 ca88官网 5

通过web应用查看日志

下来为日志显示在web浏览器里,所以新建一个URL:
/viewlog

每当终极当添加代码:

@app.route('/viewlog')
  def view_the_log() -> str:
    with open('vsearch.log') as log:
      contents = log.read()
  return contents

保留测试后键入http://127.0.0.1:5000/viewlog看到:

ca88官网 6

这些类似只有是浏览器接受以及出示最后之结果,并从未最开始搜寻的情节,检查网页的源代码,直接浏览器被右键

ca88官网 7

这些内容及才之并从未尽老距离,还是没看搜索的情,web拒绝出示用户搜索的数据,因为HTML中<Request>是一个不合法的符号,浏览器会将她忽略。

转义数据

Flask包含一个escape函数,调用时提供一个字符串,其中不含其他特殊字符:

本着有的暗含特殊字符的字符串使用是函数,它会将<>转义为&lt和&gt

ca88官网 8

于第一行调用投入escape然后以后的return后使用函数:escape(contents)

乍的测试结果:

ca88官网 9

注意到刚凡红色的配变成了黑色字,,不过这些数字并无能够看出来什么。

变更代码:

ca88官网 10

独当结尾之print做了修改,把req的内容通过dir()列出然后改成字符输出。

下来测试新的日志记录代码,先完成下列步骤:

  1. 修改log_request同齐图保持一致。
  2. 保存修改后的代码,这回又开我们的web应用。
  3. 找到并删除时之vsearch.log文件。
  4. 经过浏览器输入3独新搜索。
  5. 采取/viewlog查看新创的日志。

细看看现在底情节,有含义了吧?

ca88官网 11

马上如同有些乱,不过仔细看会发现有局部咱们查阅找到的价值。

ca88官网 12

本足视每个请求都发生大量的涉及方法与特性,记录有的特性是不曾意义的。其中有三个对日记记录非常要紧:

  • req.form:从web应用之HTML表单提交的多寡。
  • req.remote_addr:运行web浏览器的IP地址。
  • req.user_agent:提交数据的浏览器标识。

下对代码进行更的调。

记录特定的web请求属性

 ca88官网 13

分级出口这些情节,end=‘|’表示将默认的换行符替换为|,这样一个告的数据就是单排内容。

当下是初的日记文件之情:可以看数据还当一行以整齐了广大

ca88官网 14

上文中之连日四独print好像有点多余,其实可以减至一个print语句被,有一个可选的参数sep,它好设置分隔符,默认为空格。

下来改进那几行print代码:

def log_request(req: 'falsk请求', res: str) -> None:
  with open('vsearch.log', 'a') as log:
    print(req.form, req.remote_addr, req.user_agent, res, file=log, sep='|')

 继续刚才那五只步骤,就是还测试的步子。提示:存代码、删日称、新键入。

然后查URL:/viewlog会意识少了许多

ca88官网 15

得找到中来追寻的字符串也发生结果,看来已经出意义了。可是如何进一步正规化这些情节吗?

由老数据及可读之出口

下面是vsearch.log文件被之一个数据行:

ImmutableMultiDict([(‘phrase’,
‘this is s test of the posting capability’), (‘letters’,
‘aeiou’)])|127.0.0.1|Mozilla/5.0 (Windows NT 6.3;
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75
Safari/537.36|{‘o’, ‘a’,
‘e’, ‘i’}

其三个|分割了季有内容,第一局部是表单数据。第二片凡是远程机器的IP地址。第三片段凡web浏览器的标识字符串。最后一组成部分是函数调用的结果。

 

  • 应用join可以用列表转换成为字符串。

下来当>>>中进行测试:

ca88官网 16

join前面的‘|’意思是使|将每个字符串连接起来。

  • 若是split是将字符串转换成列表。

ca88官网 17

用给定的|,将字符串分割成一个列表。

 

修改代码:

下文件打开的open命令,用|将日志中之笔录转换成为一个列表,这样见面看起更为美观,可读性强。

欲修改的是view_the_log函数。

def view_the_log() -> str:
  contents = []
  with open('vsearch.log') as log:
    for lines in log:
      contents.append([])
      for item in lines.split('|'):
        contents[-1].append(escape(item))
  return escape(contents)

发出部分地方用解释:

ca88官网 18

想必你晤面对contents[-1].append(escape(item))有问题,理解这行代码技巧从外于他、从错误望右读。首先是外面for循环的item开始,它见面传递及escape,在用append将获的字符串追加至contents末尾
( [-1] ) 。contents是一个嵌套列表。

 

保存代码然后进行测试:

ca88官网 19

今日的出口变成了一个嵌套列表,而不再是一个字符串列表。现在咱们利用一个计划的jinja2模板处理contents,就核心能博取所要的可读的输出了。

故而HTML生成可读之输出

HTML提供了同等组标记来定义表格的始末:包括<table>:一个报表,<th>:一行表格数据,<tr>:一个表格列标题和<td>:一个报表数据项(单元格)。

每个标记都出照应的一个完毕标记</table>,</tr>,</th>和<td>。

假设发现需要生成HTML,就应有采取jinja2模板引擎,它要是规划用来生成HTML,这个引擎包含有基本的编程构造,可以为此来“自动实现”需要之亮逻辑。

下是一个新模板下载的地址还是之前的http://python.itcarlow.ie/ed2/,名为viewlog.html,它可以将日志文件中的原始数据转换成一个HTML表格,这个模板希望传入contents嵌套列表作为他的参数。jinja2的for循环构造与Python类似,但需要注意的是行尾不需要冒号,因为%}相当于一个分隔符;每个循环的代码组用{%
endfor %}结束。

ca88官网 20

好望,第一个for循环希望以一个叫也the_row_titles的变量中搜寻数据,而第二只for循环希望得到the_data中之数码。第三个for循环希望多少是一个多少项列表。

总体表在一个<table>标记中,描述性标题<th>中生独立的行<tr>标记。每个日志数据项在一个<td>标记中,日志文件被的各行有独立的<tr>标记。(现在恐略不便,不过后面就是见面知晓这几句话的意义)

 

此模板需要放在templates文件夹下面。

要让viewlog.html调用render_template(render_template的函数,如果指定一个模板名与所要的参数,调用这个函数时会回来一个HTML串。),为它们用之老三单参数分别传入值。下面创建一个描述性的题元组,并把其赋值给the_row_titles,然后将contents的值赋给the_data。在表现是模板之前,还待给the_title提供一个适宜的值,修改函数view_the_log:

def view_the_log() -> 'html':
    contents = []
    with open('vsearch.log') as log:
        for lines in log:
            contents.append([])
            for item in lines.split('|'):
                contents[-1].append(escape(item))
    titles = ('From Data','Remote_addr','User_agent','Results')
    return render_template('viewlog.html', 
                            the_title = 'View Log',
                            the_row_titles = titles,
                            the_data = contents,)

保存后是flask重开web应用,然后进入http://127.0.0.1:5000/viewlog查看日志:

ca88官网 21

本身本着之结果很好听,因为毕竟到手了想要之出口,并且看起挺整齐。

点击右键查看网页源代码,会看日志的每一个数项都放在她好之<td>标记中,每个数据行也发生好的<tr>标记,整个表放在一个HTML的<table>中。

ca88官网 22

 

后的推广来拘禁:

ca88官网 23

盖上得拘留出来有,现在对网页的源代码好像发出部分相貌了。

想起整整代码:

ca88官网 24

ca88官网 25

相关文章