12、flask+urllib+Xwlt

1.app.py

from flask import Flask,render_template
import sqlite3
app = Flask(__name__)


@app.route(‘/‘)
def index():
    return render_template("index.html")

## http://www.cssmoban.com/ 模板之家
## 图标网站:https://www.iconfont.cn/
##  ECHARTS网站:https://echarts.apache.org/zh/index.html
## 网站模板下载:http://www.cssmoban.com/cssthemes/9296.shtml
## 1、将模板解压,将index.html放入到模板templates中 -- 动态渲染模板
## 2、将assets放入static中                          -- 静态文件
## 注意修改index.html中的地址assets改为static/assets


@app.route(‘/index‘)
def home():
    return index()

@app.route(‘/movie‘)
def movie():
    datalist = []
    conn = sqlite3.connect("movie.db")
    cursor = conn.cursor()
    sql = "select * from movie250"
    data = cursor.execute(sql)
    for item in data:
        datalist.append(item)
    cursor.close()
    conn.close()
    return render_template("movie.html",movies = datalist)

@app.route(‘/score‘)
def score():
    score = []   ##电影评分
    num = []   ## 每个电影评分对应电影数量
    conn = sqlite3.connect("movie.db")
    cursor = conn.cursor()
    sql = "select score,count(score) from movie250 group by score"
    data = cursor.execute(sql)
    for item in data:
        score.append(str(item[0]))      ## 此处可以不用转为str类型,需要转换时,同时在HTML中使用score|tojson 转换
        num.append(item[1])
    cursor.close()
    conn.close()
    return render_template("score.html",score=score,num=num)

@app.route(‘/word‘)
def word():
    return render_template("word.html")

@app.route(‘/team‘)
def team():
    return render_template("team.html")

if __name__ == ‘__main__‘:
    app.run()

1.app.py

## Flask包含werkzeug和jinja2,其中route为werkzeug,render_template包含了jinja2
## request,表单请求模块
## 引入模块和渲染模板
from flask import Flask,render_template,request


app = Flask(__name__)       ## 模块初始化,也就是将flask框架引入当前的文件app程序中,__name__为执行条件


## 路由解析,通过用户访问的路径,匹配相应的函数
## 设置FLASK_DEBUG = 1,开启调试模式,右上角flask_demo勾选FLASK_DEBUG,重启
# @app.route(‘/‘)
# def hello_world():
#     return ‘hello,world!‘

@app.route("/index")
def hello():
    return "test function hello."

## 通过访问路径,获取用户的字符串参数
@app.route("/usr/<name>")           ## 浏览器传参,<变量>为接收传参变量,http://127.0.0.1:5000/usr/zhangfd
def welcome(name):                  ## 将传入的参数作为函数的参数
    return "welcome,%s"%name       ## 函数参数调用

## 通过访问路径,获取用户的整形参数,        此外,还有float类型
@app.route("/usr/<int:id>")         ## 路由路径不能重复,用户通过唯一路径访问特定的函数
def welcome2(id):                  ## 函数不能重复
    return "welcome,%d 号会员"%id

## 使用HTML渲染
# @app.route("/")
# def index2():
#     ## 在templates中定义html文件,templates -- new --html file -- 如:index
#     return render_template("index.html")  ## 内容在HTML中定义,并且能够识别渲染

## 向页面传递变量
import datetime
@app.route("/")
def index2():
    ## 在templates中定义html文件,templates -- new --html file -- 如:index
    time = datetime.date.today()    ## 普通变量,html中使用{{ var }}接收
    name = ["小张","小赵","小王"]     ## 列表类型
    task = {"任务":"打扫卫生","时间":"3个小时"}    ## 字典类型
    return render_template("index.html",var=time,list=name,task=task)

## 表单提交
@app.route("/test/register") ## /test/register是浏览器访问路径
def register():
    return render_template("test/register.html")    ## test/register 是文件路径


## 接收表单提交的路由,需要指定methods为post
@app.route("/result",methods=[‘POST‘,‘GET‘])
def result():
    if request.method == ‘POST‘:
        result = request.form
        return render_template("test/result.html",result = result)

if __name__ == ‘__main__‘:    ## __name__ 为全局变量
    app.run()       ## 调用run方法,启动服务器,监听5000端口,做相应操作

2. index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body >
    今天是{{ var }},欢迎光临<br>       <!-- 普通变量使用{{ var }} -->
    今天值班的有:<br>
    {% for data in list %}              <!--for 循环控制结构,此外还有if-->
        <li>{{ data }}</li>                 <!--循环语句-->
    {% endfor %}                        <!--for 循环结束-->

    任务:<br/>
    <table border="1">
        {% for key,value in task.items() %}     <!--[(key,value),(key,value),(key,value)]-->
            <tr>
                <td>{{ key }}</td>
                <td>{{ value }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

3.register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="{{ url_for(‘result‘) }}" method="post">
        <p>姓名:<input type="text" name="name"></p> <!--此处的name属性定义的是字典的key,输入的为value-->
        <p>年龄:<input type="text" name="age"></p>
        <p>性别:<input type="text" name="sex"></p>
        <p>地址:<input type="text" name="add"></p>
        <p><input type="submit" value="提交"></p>
    </form>
</body>
</html>

4.result.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1">
        {% for key,value in result.items() %}     <!--[(key,value),(key,value),(key,value)]-->
            <tr>
                <td>{{ key }}</td>
                <td>{{ value }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

urllib补充知识点

#-*- codeing = utf-8 -*-
#@Time : 2020/6/9 22:30
#@Author : zhangfudong
#@FILE :testUrllib.py
#@Software : PyCharm

## urllib补充知识点
## 引入urllib库下的request模块
import  urllib.request

# 获取一个网页,get请求方式
## 打开网页获取数据并返回
response = urllib.request.urlopen("http://www.baidu.com")
# ## 读取返回结果,使用utf-8字符集解析
print(response.read().decode(‘utf-8‘))

# post请求方式
## 网址httpbin.org,专门测试请求响应的网站,http mathods
## 模拟网站登录时就需要使用post方式,如将账号密码的键值对cookie信息发过去等等
import urllib.parse
data=bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")  ## 参数data封装为二进制字节文件
response = urllib.request.urlopen("http://httpbin.org/post",data=data) ## post访问时需要传递封装的参数data
print(response.read().decode("utf-8"))                                  ## 解码输出

## 超时处理,可以设置访问超时时间timeout
try:
    response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01) ## post访问时需要传递封装的参数data
    print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
    print("timeout")


## 返回状态码
response = urllib.request.urlopen("http://httpbin.org/get")
response = urllib.request.urlopen("http://douban.com")      ## 返回状态码为418:意思是“被发现你是一个爬虫”
print(response.status)

## 获取响应头信息
response = urllib.request.urlopen("http://www.baidu.com")
print(response.getheaders()) ## 获取所有的响应头信息,F12--network--Headers - response headers信息一致
Headers的最下方有user-agent信息,用于模拟浏览器
print(response.getheader("Server")) ##获取单个信息

import  urllib.parse
url="http://httpbin.org/post"
data=bytes(urllib.parse.urlencode({"name":"zhangsan"}),encoding="utf-8")
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
# ## 封装请求对象,模拟浏览器
req=urllib.request.Request(url=url,data=data,headers=headers,method="POST") ## 可以将请求头信息全部封装,模拟浏览器
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

## 访问豆瓣,模拟浏览器,解决418问题
import  urllib.parse
url="http://www.douban.com"
headers={
 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
## 封装请求对象,模拟浏览器
req=urllib.request.Request(url=url,headers=headers) ## 可以将请求头信息全部封装,模拟浏览器
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

Xwlt补充

#-*- codeing = utf-8 -*-
#@Time : 2020/6/14 12:26
#@Author : zhangfudong
#@FILE :Xwlt.py
#@Software : PyCharm

import  os
os.remove("student1.xls")
import xlwt
## 在Excel中打印乘法表
workbook = xlwt.Workbook(encoding="utf-8")  ## 创建workbook对象,创建Excel
worksheet = workbook.add_sheet(‘sheet1‘)    ## 创建工作表,在Excel中新建sheet1
for i in range(1,10):
    for j in range(1,i+1):
        worksheet.write(i-1,j-1,‘%d*%d=%d‘%(i,j,i*j))    ## 写入数据,行下标,列下标,内容,在sheet1中写入内容
        j+=1
    i+=1
workbook1.save(‘student1.xls‘)               ## 保存Excel

12、flask+urllib+Xwlt

上一篇:【从NIO到Netty】5.NIO EchoServer


下一篇:JSON