作者: kukey-admin

  • ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. tensorflow-gpu 2.6.0 requires typing-extensions~=3.7.4, but you have typing-extensions 4.12.2 which is incompatible.

    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    tensorflow-gpu 2.6.0 requires typing-extensions~=3.7.4, but you have typing-extensions 4.12.2 which is incompatible.

    tensorflow-gpu卸载掉就行了

  • flask 日志使用

    Python 的 logging 模块中,%(filename)s 占位符用于在日志输出中包含记录日志消息的源文件的名称。如果你的日志输出显示的是“应用”或者不是预期的文件名,这可能是因为:

    1. Logger Name: %(name)s 占位符用于输出 Logger 的名字,而不是文件名。如果你想要输出文件名,确保你在日志格式中使用的是 %(filename)s
    2. Formatter 配置: 检查你的日志格式设置是否正确。确保你的 Formatter 对象使用了 %(filename)s 而不是 %(name)s
    3. Logger Name 和默认值: 如果你使用的是默认的 logger (root logger),它的名字是 'root'。如果你创建了自定义的 logger,它的名字会是你在创建时指定的。
    4. 日志调用位置: 确保你的日志调用位于你想要输出文件名的模块中。如果你在一个模块中调用日志,但日志配置在另一个模块中,可能不会显示正确的文件名。
    5. 多个 Handlers: 如果你为同一个 logger 添加了多个 handlers,确保所有 handlers 都使用了相同的 formatter。

    根据你提供的代码,你的日志格式字符串是:

    python
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    这里使用的是 %(name)s,它将输出 logger 的名字而不是文件名。要显示文件名,你应该将格式字符串改为:

    python
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

    这样就会在日志输出中包含文件名和行号。

    另外,你的代码中创建了两个 handler,第一个是 TimedRotatingFileHandler,第二个是 FileHandler,并且第二个 handler 覆盖了第一个的设置。你应该只使用一个 handler 并确保它被添加到了 app.logger。以下是修正后的代码片段:

    # ...[省略其他导入和配置]...
    
    def create_app(config_class=Config):
        # 创建 Flask 应用
        app = Flask(__name__)
        app.config.from_object(config_class)
    
        # 创建并设置日志 handler
        handler = TimedRotatingFileHandler(
            "flask.log", when="D", interval=1, backupCount=15,
            encoding="utf-8", delay=False, utc=True
        )
        
        # 创建日志格式器并设置到 handler
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')
        handler.setFormatter(formatter)
        
        # 将 handler 添加到 Flask app 的默认 logger
        app.logger.addHandler(handler)
        app.logger.setLevel(logging.INFO)  # 设置日志级别
    
        # ...[省略初始化 CKEditor、CSRFProtect、数据库和注册蓝图等]...
    
        return app

     

    确保你的应用中只使用一个 logger,并且所有的日志调用都使用这个 logger。这样,你的日志输出就会包含正确的文件名和行号。

  • py获取路径

    获取当前项目的上一级目录

    os.getcwd()

    https://segmentfault.com/a/1190000044107610

    Python文件路径解谜:深入剖析os.path系列函数的精髓

    导入os.path模块

    获取文件路径信息

    os.path.abspath(): 获取绝对路径

    os.path.dirname(): 获取目录名

    os.path.basename(): 获取文件名

    os.path.split(): 分割目录和文件名

    os.path.join(): 拼接路径

    判断路径信息

    os.path.exists(): 判断路径是否存在

    os.path.isfile(): 判断是否为文件

    os.path.isdir(): 判断是否为目录

    os.path.islink(): 判断是否为符号链接

    获取文件属性

    os.path.getsize(): 获取文件大小

    os.path.getmtime(): 获取最后修改时间

    处理路径字符串

    os.path.normpath(): 规范化路径

    os.path.splitext(): 分割文件名和扩展名

    其他函数

    os.path.commonprefix(): 查找多个路径的公共前缀

  • 查询指定表名的字段信息

    -- 查询指定表名的字段信息
    select * from information_schema.columns where table_name='用户表'

     

  • 获取sqlite数据库的所有表名以及其字段并形成json数据

    import sqlite3
    import json
    
    def sqlite_connect(db_path: str):
        # 连接到 SQLite 数据库
        # 如果文件不存在,会自动在指定位置创建一个数据库文件
        connection = sqlite3.connect(db_path)
        json_data = {}
        try:
            with connection:
                with connection.cursor() as cursor:
                    # 获取所有表名
                    cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
                    所有表 = cursor.fetchall()
    
                    for 表名 in 所有表:
                        表名 = 表名[0]  # 获取表名
                        # 获取当前表的所有字段信息
                        cursor.execute(f"PRAGMA table_info({表名})")
                        列数据 = cursor.fetchall()
                        
                        # 存储当前表的所有字段信息
                        if 列数据:
                            json_data[表名] = [
                                {
                                    "col": 列[1],  # Column name
                                    "datatype": 列[2],  # Column type
                                    "comment": None  # SQLite does not store column comments
                                } for 列 in 列数据
                            ]
    
        except Exception as e:
            print(f"An error occurred: {e}")
        finally:
            connection.close()
    
        return json_data
    
    # 调用函数并打印结果
    # 请替换 'your_database.db' 为你的 SQLite 数据库文件路径
    result_json = sqlite_connect('your_database.db')
    print(json.dumps(result_json, ensure_ascii=False, indent=4))

     

  • 获取mysql数据库的所有表名以及其字段并形成json数据

    import pymysql
    import json
    
    def mysql_connect(用户名: str = 'root',
                      密码: str = 'root',
                      ip地址: str = '127.0.0.1',
                      端口号: int = 3306,
                      数据库名: str = 'test',
                      字符集: str = 'utf8mb4'):
        connection = pymysql.connect(host=ip地址,
                                      user=用户名,
                                      password=密码,
                                      port=端口号,
                                      database=数据库名,
                                      charset=字符集)
        try:
            cursor = connection.cursor()
            cursor.execute("SHOW TABLES")
            结果集 = cursor.fetchall()
            json_data = {}
    
            for 表名 in 结果集:
                表名 = 表名[0]  # 获取表名
                cursor.execute(f"SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='{数据库名}' AND TABLE_NAME='{表名}'")
                列数据 = cursor.fetchall()
                字段集 = []
                for 列 in 列数据:
                    列名, 数据类型, 注释 = 列
                    字段集.append({
                        "col": 列名,
                        "datatype": 数据类型,
                        "comment": 注释 if 注释 else ''  # 使用 if-else 来避免 None
                    })
                json_data[表名] = 字段集
    
        finally:
            connection.close()
    
        return json_data
    
    # 调用函数并打印结果
    result_json = mysql_connect(密码='123456', 数据库名='rkey_blog')
    print(json.dumps(result_json, ensure_ascii=False, indent=4))

     

  • py同时遍历两个i长度相同的元组

    在 Python 中,可以同时遍历两个元组(或任何其他可迭代对象),有几种方法可以实现这一点:

    使用索引

    如果你有两个长度相同的元组,可以使用索引来同时遍历它们:

    tuple1 = (1, 2, 3)
    tuple2 = ('a', 'b', 'c')

    for i in range(len(tuple1)):
    print(tuple1[i], tuple2[i])

    使用 zip()

    zip() 函数可以将多个可迭代对象中的元素配对,生成一个元组列表。这使得同时遍历多个序列变得简单:

    tuple1 = (1, 2, 3)
    tuple2 = ('a', 'b', 'c')

    for item1, item2 in zip(tuple1, tuple2):
    print(item1, item2)

    使用 itertools.zip_longest

    如果你需要遍历长度不同的序列,可以使用 itertools.zip_longest(),它允许你指定一个填充值,以防序列长度不一致:

    from itertools import zip_longest

    tuple1 = (1, 2, 3)
    tuple2 = ('a', 'b')

    for item1, item2 in zip_longest(tuple1, tuple2, fillvalue='missing'):
    print(item1, item2)

    在这个例子中,如果 tuple2tuple1 短,zip_longest 会使用 'missing' 作为填充值。

    使用列表推导式

    如果你想同时遍历两个元组并创建一个新的列表,可以使用列表推导式:

    tuple1 = (1, 2, 3)
    tuple2 = ('a', 'b', 'c')

    combined = [(t1, t2) for t1, t2 in zip(tuple1, tuple2)]
    print(combined)

    这将生成一个包含元组对的列表。

    选择哪种方法取决于你的具体需求,例如是否需要处理长度不一致的序列,或者是否需要在遍历的同时执行复杂的操作。

  • 使用bat启动python脚本,达到双击运行的效果

    chcp 65001
    title 数据库备份 
    python 运行.py
    pause

    注意,第二行,标题后面有一个空格或者换行才行

    其他

    title 数据库 空格

    其他

     

    bat启动python创建的虚拟环境

    chcp 65001
    @echo off
    title 图片格式转换
    
    :: 激活虚拟环境
    call .\myenv\Scripts\activate.bat
    
    :: 运行 Python 应用程序
    python 图片格式转换.py
    
    :: 暂停,等待用户按键后关闭窗口
    pause

     

  • python装饰器应用

    来自kimi ai

    from flask import session,flash,redirect,url_for
    from functools import wraps
    def 需要登录(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not session.get('logged_in', False):
                # 如果用户未登录,重定向到登录页面,并提示需要登录
                flash('你需要登录。')
                return redirect(url_for('login.login'))
            return f(*args, **kwargs)
        return decorated_function

     

    这段代码定义了一个名为 需要登录 的装饰器,用于 Flask 应用中保护需要用户登录后才能访问的视图函数。下面是对这段代码的详细解释:

    1. 导入必要的模块:
      from flask import session, flash, redirect, url_for
      from functools import wraps

      导入 Flask 的 session 用于访问和管理用户会话信息;flash 用于向用户显示一次性消息;redirect 用于重定向用户到另一个 URL;url_for 用于获取路由的 URL。wraps 用于保留原函数的名称和文档字符串。

    2. 定义装饰器 需要登录:
      def 需要登录(f):

      需要登录 是一个装饰器工厂函数,它接受一个函数 f 作为参数,f 通常是 Flask 应用中的一个视图函数。

    3. 使用 wraps 装饰器:
      @wraps(f)

      使用 wraps 来包装 decorated_function,这样可以让装饰后的函数保持原始函数 f 的名称和文档字符串。

    4. 定义嵌套函数 decorated_function:
      def decorated_function(*args, **kwargs):

      decorated_function 是一个嵌套函数,它将作为装饰器返回的函数。它接受任意数量的位置参数 *args 和关键字参数 **kwargs,以便将这些参数传递给原始的视图函数 f

    5. 检查用户是否已登录:
      if not session.get('logged_in', False):

      使用 session.get 方法检查 session 中是否有 'logged_in' 键,并且其值是否为 True。如果用户未登录(即 'logged_in' 键不存在或值为 False),则执行以下重定向和消息提示操作。

    6. 显示登录提示并重定向到登录页面:
      flash('你需要登录。')
      return redirect(url_for('login.login'))

      使用 flash 函数向用户显示一条消息,提示用户需要登录。然后使用 redirect 函数和 url_for 函数重定向用户到登录页面。这里假设登录视图函数的端点(endpoint)名称为 'login.login'

    7. 调用原始的视图函数:
      return f(*args, **kwargs)

      如果用户已登录,decorated_function 将调用原始的视图函数 f,并传入所有接收到的参数。

    8. 返回装饰器函数:
      return decorated_function

      需要登录 装饰器返回 decorated_function 函数,这样它就可以被用作装饰器。

    使用这个装饰器,你可以保护 Flask 应用中的任何视图函数,确保只有登录用户才能访问。例如:

    @app.route('/protected')
    @需要登录
    def protected():
    return "这是一个受保护的页面,只有登录用户才能看到。"

    在这个例子中,任何尝试访问 /protected 路由的用户,如果没有登录,都会被重定向到登录页面,并在登录页面上显示一条消息。如果用户已经登录,他们将能看到受保护页面的内容。

  • bootstrap rounded

    Bootstrap 是一个流行的前端框架,它提供了多种类来帮助开发者快速实现响应式和美观的网页设计。在 Bootstrap 中,rounded 是用来给元素添加圆角的 CSS 类。

    以下是一些常用的圆角类:

    • .rounded:给元素的每个角添加一个小圆角。
    • .rounded-top:只给元素的顶部两个角添加圆角。
    • .rounded-right:只给元素的右侧两个角添加圆角。
    • .rounded-bottom:只给元素的底部两个角添加圆角。
    • .rounded-left:只给元素的左侧两个角添加圆角。
    • .rounded-circle:使元素的每个角都完全圆,形成一个圆形。
    • .rounded-pill:给元素的每个角添加一个大圆角,使其看起来像一个药丸形状。

    你可以将这些类添加到任何 HTML 元素上,以改变其外观。例如:

    <!-- 给按钮添加圆角 -->
    <button class="btn btn-primary rounded">按钮</button>
    
    <!-- 只给按钮的顶部添加圆角 -->
    <button class="btn btn-secondary rounded-top">按钮</button>
    
    <!-- 使按钮看起来像一个圆形 -->
    <button class="btn btn-success rounded-circle">确定</button>

    请注意,Bootstrap 的版本可能会影响可用的类和它们的行为。上述类在 Bootstrap 4 和 Bootstrap 5 中都是可用的,

    但是在 Bootstrap 3 中,圆角类的命名可能略有不同。

    如果你使用的是 Bootstrap 3,可以使用 .rounded.rounded-top.rounded-right.rounded-bottom.rounded-left 类,但 .rounded-circle.rounded-pill 类是不可用的。