初始flask

消失的她發表於2024-06-07

安裝

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

相關文章