javascript - Flask-assets - 如何防止特定应用程序的静态 js 文件被另一个应用程序使用

标签 javascript python html flask flask-assets

我过去曾经这样做过,但我完全忘记了我是如何做到的。 我正在开发一个 Flask 服务器,其中包含多个应用程序,并且静态文件捆绑在一起,但我希望每个应用程序的静态文件夹中的 js/css 文件仅由该应用程序的 init.py 文件中定义的路由使用。

假设我有一个 appA 和 appB:

app
- static // this contains my common js/css files
- apps
 - appA
   - __init__.py
   - static // appA's js/css files
 - appB
  - __init__.py
  - static // appB's js/css files

我转到“localhost:8000:/appA”(假设它是我定义的路由)。在它的 js 文件中我有

$(document).ready(function(params) {
    console.log('appA ready');
});

如果我转到“localhost:8000/appB”并且它的 js 文件中有

$(document).ready(function(params) {
    console.log('appB ready');
});

无论我运行哪条路线,我都会在控制台中看到“appA Ready”和“appB Ready”打印。 现在我知道这是有道理的。毕竟我已经将它们捆绑在一起并缩小了。但就我的一生而言,我知道我过去使用过 bundle ,但能够找出哪个应用程序使用了哪个静态文件。

重点是使用基本静态目录来存储常见内容,使用应用程序的静态目录来存储特定于应用程序的内容。

我的 Assets 已这样配置

from app.apps.appA import appA
from app.apps.appA import appA_js, appA_css

from app.apps.appB import appB
from app.apps.appB import appB_js, appB_css


flask_app.register_blueprint(appA)
flask_app.register_blueprint(appB)

globals_js = ('js/utils/jquery-3.4.1.min.js',
          'js/utils/socket.io.js',
          'js/utils/*.js')
globals_css = ('css/utils/common.css',
           'css/utils/*.css')

assets = Environment(flask_app)
bundle_globals_js = Bundle(*globals_js + appA_js + appB_js, filters='jsmin', output='dist/local_js.js')
bundle_globals_css = Bundle(*globals_css + appA_css + appB_css, filters='cssmin', output='dist/local_css.css')

assets.register('base_js', bundle_globals_js)
assets.register('base_css', bundle_globals_css)

我觉得我的资源包配置有问题。要么就是这样,要么就是我在 html 中导入文件的方式。

<head>
    {% assets "base_js" %}
        <script type="text/javascript" src="{{ ASSET_URL }}"></script>
    {% endassets %}
    {% assets "base_css" %}
        <link rel="stylesheet" href="{{ ASSET_URL }}"/>
    {% endassets %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>{{title}}</title>
</head>

这是 appA 和 appB 所使用的每个特定 html 文件的 header 代码。 关于如何使用 bundle ,这里可能存在一个根本性的误解。 我只想指定一个公共(public)静态目录,但能够让我的应用程序将自己的 js/css 文件与这些基本文件结合使用。

有人能指出我正确的方向吗?

谢谢!

最佳答案

我想通了,尽管不是我内存中的方式。

而不是将我的所有静态文件捆绑在一起作为“base_js”或“base_css”包, 我创建了具有唯一名称的单独 bundle 。

bundles = {
   'globals_js': Bundle('js/utils/jquery-3.4.1.min.js',
                     'js/utils/socket.io.js',
                     'js/utils/*.js',
                     filters='jsmin',
                     output='dist/local_global_js.js'),

   'globals_css': Bundle('css/utils/common.css',
                     'css/utils/*.css',
                     filters='cssmin',
                     output='dist/local_global_css.css'),       

   'appA_js': Bundle(*appA_js, 
                      filters='jsmin',
                      output='dist/local_appA_js.js'),

   'appA_css': Bundle(*appA_css, 
                       filters='cssmin',
                       output='dist/local_appA_css.css'),          

   'appB_js': Bundle(*appB_js, 
                               filters='jsmin',
                               output='dist/local_appB_js.js'),

   'appB_css': Bundle(*appB_css, 
                       filters='cssmin',
                       output='dist/local_appB_css.css')

}

现在我指定一个基本 html 文件,在头部添加全局资源

<head>
    {% assets "globals_js" %}
        <script type="text/javascript" src="{{ ASSET_URL }}"></script>
    {% endassets %}
    {% assets "globals_css" %}
        <link rel="stylesheet" href="{{ ASSET_URL }}"/>
    {% endassets %}
</head>
<body>        
 {%block data %}{% endblock %}

</body>
</html>

在 appA 或 appB 中,我扩展了该基本 html 文件,并在扩展代码块中添加了我的特定静态资源。

{% extends "base.html" %}

{% block data %}
{% assets "appA_js" %}
    <script type="text/javascript" src="{{ ASSET_URL }}"></script>
{% endassets %}
{% assets "appA_css" %}
    <link rel="stylesheet" href="{{ ASSET_URL }}"/>
{% endassets %}

{% endblock %}

现在appA/appB只加载各自的静态文件。

谢谢!

关于javascript - Flask-assets - 如何防止特定应用程序的静态 js 文件被另一个应用程序使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740924/

相关文章:

python - 嵌套的 Django 表单 : 'ManagementForm data is missing or has been tampered with'

python - 如何使用 Selenium webdriver 单击悬停菜单中的链接?

javascript - 使用 ajax 发布错误信息

html - 当我希望纯 CSS 下拉菜单完全居中时,它们位于左边距的中心

javascript - 从 javascript 调用 codeigniter 方法并传递数据

javascript - 如何检查键值对是否匹配(无论大小写)?

python - 迭代两个不同长度的生成器,其中一个环绕

javascript - 使用淡入/淡出和向上滚动菜单

javascript - 将音频数据 uri 字符串转换为文件

php - 全高右格