初始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']