安裝
pip install flask
一個最簡單的flask頁面
這樣透過右鍵直接執行py檔案即可,檔名必須叫做 app.py
from flask import Flask
app = Flask(__name__)
# @app.route('/', methods=(['get', 'post'])) route 第一個是訪問的路徑, methods等於請求的方法。
@app.get('/')
def index():
return "my first flask page."
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")
兩個額外的包(flask預設不安裝)
python-dotenv
pip install python-dotenv
前置條件:必須建立一個.env的檔案,路徑隨意,一本都是和執行檔案放一起,或者放到專案的根路徑。
.env檔案是不會提交到伺服器的,記得git檔案忽略掉。.gitignore
在.env裡面寫入如下內容:
NAME='小滿'
PASSWORD="xm123"
主程式使用。
import os
from dotenv import load_dotenv # 匯入必要的模組
from dotenv import dotenv_values # 獲取值的模組
res = load_dotenv()
print(res) # 布林值 True
name = os.getenv('NAME')
password = os.getenv('PASSWORD')
print(name, password) # 小滿
# ----------- 另外一種方法
config = dotenv_values('.env')
print(config) # OrderedDict([('NAME', '小滿'), ('PASSWORD', 'xm123')])
print(config.get('NAME')) # 小滿
print(config.get('PASSWORD')) # xm123
watchdog
https://juejin.cn/post/7301577141891203123
pip install watchdog
# 當前目錄下檔案修改會被監控到,列印日誌
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = sys.argv[1] if len(sys.argv) > 1 else '.'
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
click
import click
@click.command()
@click.option('--count', default=3, help="執行次數")
@click.option('--name', prompt="your name", help="the person to great")
def hello(count, name):
for line in range(count):
# click.echo(f'hello {name}')
print(f'hello {name}')
if __name__ == "__main__":
hello()
啟動flask的幾種方式
# 方式一: python -m flask --app 6-第一個flask run
# 方式二: flask --app 6-第一個flask run
# 方式三: flask run --host=0.0.0.0 # py檔案必須叫app.py
# flask --app hello run --debug
# 方式四:使用pycharm快速執行 配置一個 flaskserver
# 方式五:直接右鍵執行,必須加入如下程式碼
'''
if __name__ == '__main__':
app.run()
'''
'''
# 執行當前專案
python -m flask --app hello run
# 或者
flask --app hello run
flask run --host=0.0.0.0
'''
debug模式
# 執行時,開啟debug模式
flask --app hello run --debug
# debug模式
-自動重啟
-錯誤提示
fastapi的快速使用
pip install fastapi
from fastapi import FastAPI
# 建立一個FastAPI例項
app = FastAPI()
# 定義根路徑的GET請求處理函式
@app.get('/')
def index():
return {"code": 100, "msg": "成功"}
# 如果作為主程式執行,則使用uvicorn執行應用
if __name__ == "__main__":
import uvicorn
uvicorn.run(app='04-初始fastapi:app', port=8900) # 使用uvicorn執行應用,監聽埠8900
render_template, redirect, session, request, jsonify
render_template 存放HTML檔案的資料夾,預設是這個名字 可以修改。
redirect 重定向,重定向的時候寫路徑就可以了
session 存放cookie session當瀏覽器關閉就失效了,注意使用session,一定要設定app.secret_key 不然會報錯。
jsonify 返回一個json格式的資料
from flask import Flask, render_template, redirect, session, request, jsonify
# 建立一個Flask應用例項
app = Flask(__name__, template_folder="templates", static_folder="static")
app.secret_key = "hunjkjfoidjioajioe697324" # 設定應用的金鑰
# 定義根路徑的GET請求處理函式
@app.get('/')
def index():
if session.get('username'): # 檢查使用者是否已登入
data = {
"name": "小滿",
"age": 3,
"hobby": ['摸魚', "逃課"]
}
return render_template('index.html', data=data) # 渲染index.html模板並傳入資料
else:
return redirect('/login') # 重定向到登入頁面
# 定義返回JSON資料的GET請求處理函式
@app.get('/jsonify')
def to_jsonify():
return jsonify({"content": "本想收穫一縷清風,你卻給了我一整個春天。"})
# 定義登入頁面的GET和POST請求處理函式
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == "GET":
return render_template('login.html') # 渲染登入頁面模板
else:
username = request.form.get('username') # 取出使用者名稱和密碼
password = request.form.get('password')
if username == '小滿' and password == "xm123":
session['username'] = username # 將使用者名稱儲存到session中
return redirect('/') # 登入成功後重定向到根路徑
else:
return render_template("login.html", error="使用者名稱或密碼錯誤。") # 顯示登入錯誤資訊
# 如果作為主程式執行,則使用Flask內建的開發伺服器執行應用
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0") # 執行應用,開啟除錯模式,監聽所有公網IP地址
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% for line in data %}
<p>{{line}}</p>
{% endfor %}
<p><a href="/jsonify">去josnify</a></p> <!-- 跳轉連結 注意href -->
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登入介面</title>
</head>
<body>
<form method="post">
<p>姓名:<input type="text" name="username"></p>
<p>密碼:<input type="password" name="password"></p>
<input type="submit" value="提交">
<p>{{error}}</p> <!-- 當失敗的時候才渲染報錯資訊 -->
</form>
</body>
</html>
登入認證裝飾器
# 問題一:登入裝飾器,放上還是下 放下面
# 問題二:每個路由有個別名【反向解析】--》這個別名如果不寫--》會以函式名作為別名--》一旦加了登入認證裝飾器,所有別名都變成了 inner
# 1 使用裝飾器裝飾裝飾器 @wraps(func)
# 2 每個人都指定別名
def login_required(func):
@wraps(func)
def inner(*args, **kwargs):
if session.get('username'):
res = func(*args, **kwargs)
return res
else:
return redirect('/login')
return inner
@app.get('/')
@login_required
def index():
pass
flask的配置檔案
# 1 django中配置檔案用的是: settings.py
-實際開發中用了兩套配置檔案
# 2 flask配置檔案使用--之 預設配置項- -debug --SECRET_KEY
print(app.config)
flask中的配置檔案是一個flask.config.Config物件(繼承字典),預設配置為:
{
'DEBUG': get_debug_flag(default=False), 是否開啟Debug模式
'TESTING': False, 是否開啟測試模式
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'LOGGER_NAME': None,
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None,
'APPLICATION_ROOT': None,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
}
# 3 修改預設
# 方式一:直接在app上改,實際他們在config屬性上(開發階段用)
app.debug=True
app.secret_key='asdfasdf'
# 方式二:透過app.config改--》celery就是這樣
app.config['DEBUG']=True
app.config['SECRET_KEY']='aaaa'
# 方式三:app.config.from_pyfile("python檔名稱")--跟django一樣
1 寫一個 settings.py
2 app.config.from_pyfile('settings.py')
# 方式四:app.config.from_object('settings.TestingConfig')
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = '127.0.0.1'
DATABASE_PORT = 3306
class ProductionConfig(Config):
DATABASE_URI = '192.168.1.11'
DATABASE_PORT = 3308
class DevelopmentConfig(Config):
DEBUG = True
# 方式其他:
app.config.from_envvar("環境變數名稱")
app.config.from_json("json檔名稱")
app.config.from_mapping({'DEBUG': True}) #可能會用
- 配置中心---》服務--》有個地址,傳送請求會返回一對json格式配置檔案
-nocos
# dotenv的使用
# 4 設定自己(跟修改預設一樣)
-app.config['DB_PASSWORD']='xm123'
補充知識點
django如何自定義命令
在app的根目錄下面,不是專案根目錄,並且這個app已經被註冊了。
myapp/
__init__.py
models.py
views.py
management/ # 必須叫這個名字
__init__.py
commands/
__init__.py
getContent.py # 自定義的名字
getContent.py中
from typing import Any
import requests
from fake_useragent import UserAgent
from django.core.management.base import BaseCommand
# 必須定義 Command 這個類
# 必須繼承 BaseCommand
class Command(BaseCommand):
help = "用於獲取一句隨機文字"
# 核心邏輯 入口
def handle(self, *args: Any, **options: Any) -> str | None:
content = self.get_request()
self.stdout.write(content) # 如果想要命令列輸出結果 必須使用self.stdout.write()
def get_request(self):
headers = {"User-Agent": UserAgent().random}
res = requests.get(url="https://zttvis.cn/api", headers=headers).json()
return res['data']
WSGI和ASGI的區別
https://www.cnblogs.com/greencollar/p/14956928.html