为什么Python会在覆盖文件的开头添加不必要的字符?

时间:2018-08-19 08:54:38

标签: python regex django python-3.x

在一个Django项目中,我创建了一个.env文件来存储我的应用程序的机密凭据。我正在使用控制台命令生成一些凭据。这是我的初始.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

我不确定为什么,但是我不能复制那些有线字符,所以我已经附上了它的屏幕截图。

1 个答案:

答案 0 :(得分:3)

不确定为什么,但是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.seek(0)之前使用fp.truncate()

@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()