为什么Python在重写文件时在文件的开头添加不必要的字符?

2024-04-27 04:38:28 发布

您现在位置:Python中文网/ 问答频道 /正文

Django项目中,我创建了一个.env文件来存储我的应用程序的秘密凭证。我使用console命令来生成一些凭证。这是我的初始.env文件

SECRET_KEY=CHANGE_IT
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=database_name
DB_USERNAME=database_username
DB_PASSWORD=database_password
DB_SCHEMA=database_schema_name

这是我的generate_secret控制台命令,用随机字符串覆盖SECRET_KEY

import re
import os

from django.core.management import BaseCommand
from django.core.management.utils import get_random_secret_key


class Command(BaseCommand):
    help = ''

    def handle(self, *args, **options):
        env_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../.env'))

        self.set_secret_key(env_path, get_random_secret_key())

    @staticmethod
    def set_secret_key(env_file_path, secret_key):
        fp = open(env_file_path, 'r+')

        current_env = fp.read()
        regex = r"(SECRET_KEY=.*?)\n"

        matches = re.findall(regex, current_env, re.MULTILINE)

        updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

        fp.truncate(0)
        fp.write(updated_env)

        fp.close()

问题是,当我运行这个命令时,它会正确地覆盖SECRET_KEY,但也会在.env文件的开头添加一堆有线字符。我在Ubuntu 18.04操作系统上运行。这是运行命令后的.env文件

enter image description here

我不知道为什么,但我不能复制这些有线字符,所以我附上了它的截图。你知道吗


Tags: 文件pathkeyimport命令reenvdb
1条回答
网友
1楼 · 发布于 2024-04-27 04:38:28

不知道为什么,但是fp.truncate(0)似乎是罪魁祸首(更多信息请参见Behaviour of truncate() method in Python)。你知道吗

就我个人而言,我会分两步来做:首先读取文件,然后重写。你知道吗

@staticmethod
def set_secret_key(env_file_path, secret_key):
    with open(env_file_path, 'r') as fp:
        current_env = fp.read()

    regex = r"(SECRET_KEY=.*?)\n"
    matches = re.findall(regex, current_env, re.MULTILINE)
    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    with open(env_file_path, 'w')as fp:
        fp.write(updated_env)

如果您想一步完成,请按照Open file for reading and writing with truncate的建议在fp.truncate()之前使用fp.seek(0)。你知道吗

@staticmethod
def set_secret_key(env_file_path, secret_key):
    fp = open(env_file_path, 'r+')

    current_env = fp.read()
    regex = r"(SECRET_KEY=.*?)\n"

    matches = re.findall(regex, current_env, re.MULTILINE)

    updated_env = current_env.replace(matches[0], 'SECRET_KEY={}'.format(secret_key))

    fp.seek(0)
    fp.truncate()
    fp.write(updated_env)

    fp.close()

相关问题 更多 >