Flask
轻量级框架:flask,web.py,tornado,开发灵活,开发效率低,可以真正体现程序员的水平。
重量级框架:django,方便程序员开发,提供大量的功能组件(站点管理,csrf_token,富文本,表单类,缓存,日志,ORM)
flask提供了什么?
- 只能够完成最简单的请求响应
- jinja2:模板系统
- werkzeug:工具箱(wsgi)
- 插件
一、开始Flask
flask版本:1.1.1
(一)创建虚拟环境
创建虚拟环境
conda create -n FlaskPath python=3.5.2
激活虚拟环境
activate FlaskPath
(二)安装flask
pip install flask==1.1.1
(三)使用Flask
搭建最简单的flask项目–hello world
启动
默认在5000端口
(四)代码详解
1.Flask()参数
import_name,传__name__
flask项目所在的目录,所在的包位置
决定了flask静态文件和模板文件的寻找地址
static_url_path
静态文件的访问地址,默认值为/+static_folder,可不传
static_folder
静态文件的目录名,默认值为static,可不传
template_folder
模板文件的存储位置,默认值为templates,可以不传
2.路由
flask中的路由和django中的路由有区别
django中使用路由:
urls.py中
path('xx',xxx)
flask中使用路由:
使用装饰器
@app.route('/index/')
def index():
xxx
flask中,写路由,需要注意:
- url应该以’/'开头
- url中应以’/‘开头,以’/'结尾
- 视图函数不能重名
- 习惯:视图和路由同名
3.路由传参
转换器语法
类型:
string 默认类型
int 整型
float 浮点型
path 包含斜杠的路径,常用于路径的拼接
http://timgsa.baidu.com/timg/http://xxx.nipic.com
将参数类型由path改为string,参数仍为http://www.baidu.com,会报错。
uuid 通用的唯一标识码
(五)请求
django中
request.method
request.GET.get()
request.POST.get()
flask中
默认支持get请求
获取GET请求参数
POST
flask中默认不支持post请求
解决:
获取POST请求的参数
request–请求上下文
form flask import request
agrs 获取get请求的参数
form 获取post请求的参数
cookies 获取cookie
method 获取请求方式
url 获取请求url地址
file 获取请求上传的文件
headers 请求报文的头
二、静态文件
django中需要配置settings.py
flask中在flask启动文件的同目录,创建static文件,也可通过Flask参数修改
三、模板
flask使用的是jinja2的模板系统
在脚本文件同级目录创建templates目录,也可通过Flask参数修改
(一)模板传递数据
方法一
方法二
方法三
**:解包
(二)模板语法
视图
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h1>我是Index</h1>
{{ name }}
{{ age }}
<hr>
{{ name.upper() }}
<hr>
{{ name.replace('a','x') }}
<hr>
{{ name.1 }}
<hr>
{{ name + '好水' }}
<hr>
{{ name.split('a') }}
<h2>jinja2循环</h2>
{% for one in name %}
{{ one }}<br>
{% endfor %}
<hr>
<h2>jinja2判断</h2>
{% if name == 'hahaha' %}
<p>正确</p>
{% else %}
{{ name }}
{% endif %}
<hr>
<h2>字典</h2>
{{ mydict['math'] }}<br>
{{ mydict.math }}<br>
{{ mydict.get('math') }}<br>
<hr>
{% for key in mydict.keys() %}
{{ key }}:{{ mydict.get(key) }}<br>
{% endfor %}
<hr>
<img src="/static/bqb.jpg">
</body>
</html>
(三)模板继承
与django类似
管理系统
四、制作日历
date.py
import calendar
import datetime
class MyDate(object):
def __init__(self):
now_time = datetime.datetime.now()
year = now_time.year
month = now_time.month
# 初始化
self.result=[]
# 当月总天数
total_day = calendar.monthrange(year, month)[1]
# 第一天
first_day = datetime.date(year,month,1)
# 第一天是周几
first_week = first_day.weekday() # 从0开始,0代表周一,6代表周日
last_week = datetime.date(year,month,total_day).weekday()
all_day = [x for x in range(1,total_day+1)]
# 前面补充empty
lines = []
for i in range(first_week):
lines.append('empty')
for j in range(7-first_week):
lines.append(all_day.pop(0))
self.result.append(lines)
while all_day:
line = []
for i in range(7):
if len(line)<7 and all_day:
line.append(all_day.pop(0))
else:
line.append('empty')
self.result.append(line)
def get_date(self):
# 返回结果
return self.result
def print_date(self):
# 将结果打印出来
print(self.result)
if __name__ == '__main__':
date = MyDate()
date.print_date()
视图
模板
<table class="table">
<tr>
<th>星期一</th>
<th>星期二</th>
<th>星期三</th>
<th>星期四</th>
<th>星期五</th>
<th>星期六</th>
<th>星期日</th>
</tr>
{% for i in range(n) %}
<tr>
{% for j in result[i] %}
{% if j == 'empty' %}
<td></td>
{% else %}
<td>{{ j }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>