Django template 中如何获取 App 中的变量值

template 中有个websocket 需要获取 配置文件中的 ip 和port

from django.apps import AppConfig
from selenium import webdriver
import json

class myappConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "myapp"
    config_file_path = r'.\config.json'

    with open(config_file_path, 'r', encoding='utf8') as fp:
        opt = json.load(fp)
        print('[INFO] mysite Config:', opt['mysite'])
        opt_site = opt['mysite']
    
    IP = opt_site['IP']

在 templates 的html 中应该如果获取到这个ip 以便 js 中可以连接呢?

var IP = "{% ??这块应该咋写 %}"

var ws = new WebSocket(IP);

注意,这个 IP属于配置项 ,我认为不通过render 的方式进行传入比较好吧,是否有哪个对象可以直接读取?

TechWhizKid参考GPT回答:

在视图函数中获取到配置文件中的 IP 和端口,通过 Django 模板语言将它们传递给你的模板。具体操作步骤:

  1. 在视图函数中,读取配置文件并获取 IP,然后将 IP 作为一个变量传递给模板。
from django.shortcuts import render
import json

def your_view_function(request):
    config_file_path = r'.\config.json'
    with open(config_file_path, 'r', encoding='utf8') as fp:
        opt = json.load(fp)
        opt_site = opt['mysite']
    IP = opt_site['IP']
    return render(request, 'your_template.html', {'IP': IP})

要将 'your_template.html' 替换为实际模板的名称,而 your_view_function 则应替换为你实际的视图函数名称。
2. 在 HTML 模板中,用 Django 模板语言获取 IP。

var IP = "{{ IP }}";

var ws = new WebSocket(IP);

上面的 "{{ IP }}" 语句就是 Django 模板语言中的变量标记,它将被替换为从视图函数传递过来的 IP 值。
这样,你就可以在模板中使用配置文件中的 IP 了。

在Django中,默认情况下,你不能直接在HTML页面中调用settings.py中的变量。这是出于安全和设计的考虑,以避免将敏感信息暴露给客户端。如果你不想使用render方法将参数传递至前端页面,那么可以使用以下方法:

  1. 首先在你应用的settings.py里设置你的变量,比如:
    SITE_IP = "192.168.0.100"
    你可以使用你自己的变量名和变量值

  2. 在应用中新建一个python文件: context_processors.py

from django.conf import settings


def custom_settings(request):
    custom_context ={
        'IP': settings.SITE_IP
    }
    return custom_context
  1. 在你的Django项目的配置文件(settings.py)中,将新的上下文处理器添加到TEMPLATES设置中的context_processors选项中:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ...
                'yourapp.context_processors.custom_settings',
            ],
        },
    },
]

确保将yourapp替换为你自己的应用程序名称。

  1. 现在,就可以在HTML模板中使用IP变量了。
    {{ IP }}

可以在 views.py 中将 IP 变量传递给 template ,然后在 template 中通过变量名获取 IP 值。

假设在 views.py 中有如下代码:

from django.shortcuts import render
from myapp.apps import myappConfig
 
def my_view(request):
    IP = myappConfig.IP
    return render(request, 'my_template.html', {'IP': IP})

在 template 中可以这样获取 IP 值:

var IP = "{{ IP }}";

然后就可以用 IP 变量来连接 WebSocket 了。

var IP = "{% myapp.IP%}";
var ws = new WebSocket(IP);