为什么Python在覆盖文件时在文件开头添加不必要的字符?
在一个为什么Python在覆盖文件时在文件开头添加不必要的字符?,python,regex,django,python-3.x,Python,Regex,Django,Python 3.x,在一个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
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
console命令,用随机字符串覆盖secret_密钥
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()
问题是,当我运行该命令时,它会正确地覆盖密钥
,但也会在.env
文件的开头添加一些有线字符。我运行的是ubuntu18.04
操作系统。这是运行命令后的.env
文件
我不知道为什么,但我无法复制这些有线字符,因此我附上了它的屏幕截图。不知道为什么,但
fp.truncate(0)
似乎是罪魁祸首(有关更多信息,请参阅)
就我个人而言,我会分两步来做:首先读取文件,然后重写它
@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)
如果要一步完成,请按照建议在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()
不确定原因,但fp.truncate(0)
似乎是罪魁祸首(有关更多信息,请参阅)
就我个人而言,我会分两步来做:首先读取文件,然后重写它
@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)
如果要一步完成,请按照建议在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()
仅供参考:r”(SECRET\u KEY=.*?\n“
可以写成r”SECRET\u KEY=.*”
re.MULTILINE
是不必要的。很酷,谢谢,但是你能发现一些问题吗?仅供参考:r“(SECRET\u KEY=.*?)\n“
可以写成r“SECRET\u KEY=.*”
<代码>关于多行
是不必要的。很酷,谢谢,但是你能发现一些问题吗?