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>