初始flask

安装

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

posted @ 2024-06-07 20:02  小满三岁啦  阅读(12)  评论(0编辑  收藏  举报