【问题标题】:Link CSS file from React index.html to Flask backend将 CSS 文件从 React index.html 链接到 Flask 后端
【发布时间】:2019-07-15 22:10:53
【问题描述】:

我正在尝试将 Flask 提供的一些静态后端内容的 CSS 模板链接到我的 React 前端。

这是我的结构:

client/
      src/
         components/
                   menu.jsx
      public/
            index.html
web/
   project/
          api/
             routes/
                   templates/
                            menu.html
                            loading.html
                   static/
                         css/
                            bootstrap.css
                            mug.css

在我的第一次尝试中,我尝试像这样链接静态内容:

index.html

DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='css/bootstrap.css')}}">
    <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='css/mug.css')}}">    
    <title>My App</title>
  </head>
  <body>    
    <div id="root">
    </div>    
  </body>
</html>

上述方法无效。


我知道如果我将所有 CSS 放入“client/public”,bootstrap.css 将起作用,但 mug.css 不会,因为它应该是动态渲染的,当“menu.jsx”渲染我的后端时模板作为一个整体,通过 'dangerouslysetHTML',像这样:

menu.jsx

render(){
    var menu_html = this.state.menu_template;
    var menu_template = { __html: menu_html };
    return (
        <div id="parent">
            <h1 className="title is-1"><font color="#C86428">Menu</font></h1>
            <hr/><br/>
            <div dangerouslySetInnerHTML={menu_template}/>
        </div>
    );       
}

等等:

menus.html

<a href="{{ url_for('loading') }}</a>

等等:

loading.html

<div class="cup">
  <div class="coffee"></div>
</div>
<div class="smoke"></div>
<p class="txt">Brewing...<br><small></small></p>

终于:

mug.css

@import url(https://fonts.googleapis.com/css?family=Josefin+Sans:100,400);

body {
  background:rgb(223,189,150);
  font-family: 'Josefin Sans', sans-serif;
  text-align:center;
}

.cup {
  width:76px;
  height:76px;
  background:#dedede;
  border-radius:50%;
  position:absolute;
  left:50%;
  margin-left:-38px;
  top:100px;
  box-shadow:-4px -1px 0 rgba(0,0,0,0.2);
}

.cup:after{
  content:"";
  width:66px;
  height:66px;
  position:absolute;
  border-radius:50%;
  background:linear-gradient(-45deg, #cbcbcb, #f2f2f2 );
  left:50%;
  margin-left:-33px;
  top:5px;
}

.coffee{
  width:47px;
  height:47px;
  background:#613317;
  /*background-image: linear-gradient(15deg, transparent 0px, transparent 29px, rgba(255,255,255,0.05) 29px, rgba(255,255,255,0.05) 47px);*/
  border-radius:50%;
  position:absolute;
  left:50%;
  margin-left:-25px;
  z-index:1;
  top:50%;
  margin-top:-26px;
  border:3px solid #e9e9e9;
  box-shadow:-3px 2px 0 rgba(0,0,0,0.1);
  transform:rotate(30deg);
  transition:transform 0.3s;
}

.coffee:after{ /*assa*/
 content:"";
  width:15px;
  height:8px;
  position:absolute;
  left:-19px;
  top:18px;
  background:linear-gradient(90deg, #d6d6d6, #aeaeae);
  box-shadow:0px 2px 0 rgba(0,0,0,0.2);
}

.coffee:before {
  content:"";
  width:47px;
  height:47px;
  background-image: radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 95%), radial-gradient(5% 9%, ellipse, rgba(255,255,255,0.1), transparent 5%), radial-gradient(0% 0%, ellipse, rgba(255,255,255,0.3), transparent 55%);
  background-image: -webkit-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 95%), -webkit-radial-gradient(5% 9%, ellipse, rgba(255,255,255,0.1), transparent 5%), -webkit-radial-gradient(0% 0%, ellipse, rgba(255,255,255,0.3), transparent 55%);
  background-image: -moz-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 95%), -moz-radial-gradient(5% 9%, ellipse, rgba(255,255,255,0.1), transparent 5%), -moz-radial-gradient(0% 0%, ellipse, rgba(255,255,255,0.3), transparent 55%);
  position:absolute;
  left:0;
  border-radius:50%;
}
.cup:hover .coffee {
  transform:rotate(15deg);
}

.smoke {
  width:70px;
  height:100px; 
  background:;
  position:absolute;
  left:50%;
  margin-left:-40px;
  top:43px;
  background-image: -webkit-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), -webkit-radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), -webkit-radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%), -webkit-radial-gradient(55% 35%, ellipse, rgba(255,255,255,0.2), transparent 15%);
  background-image: -moz-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), -moz-radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), -moz-radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%), -moz-radial-gradient(55% 35%, ellipse, rgba(255,255,255,0.2), transparent 15%);
  background-image: radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%), radial-gradient(55% 35%, ellipse, rgba(255,255,255,0.2), transparent 15%);
  animation:bk 11s infinite ;
}

.smoke:after {
  content:"";
  width:100px;
  height:100px; 
  background:;
  position:absolute;
  background-image: -webkit-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), -webkit-radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), -webkit-radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%);
  background-image: -moz-radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), -moz-radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), -moz-radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%);
  background-image: radial-gradient(75% 59%, ellipse, rgba(255,255,255,0.2), transparent 25%), radial-gradient(25% 70%, ellipse, rgba(255,255,255,0.2), transparent 15%), radial-gradient(35% 61%, ellipse, rgba(255,255,255,0.2), transparent 10%);
  animation:bk 2s 1s infinite;
}


@keyframes bk {
  0%{ background-position:0 0; opacity:0; }
  15%, 85% { opacity:1;}
  100%{ background-position:-20px -25px, -5px -25px, 0px -25px, 0px -25px; opacity:0;}
}

.txt{
  position:absolute;
  top:184px;
  width:150px;
  left:50%;
  margin-left:-75px;
}

.txt a{
  text-decoration:none;
  color:#613317;
}

.txt a:hover {
  text-decoration:underline;
}

问题:

那么,如何将此后端 CSS 链接到我的前端 index.html,或者如何应用它?

【问题讨论】:

    标签: css reactjs flask


    【解决方案1】:

    我不知道(更像是我不认为)有一种方法可以使用普通的 Jinja 模板直接将 Flask 与 react 链接。如果你要使用像 ReactJS 这样的前端框架,你将不得不使用两个完全独立的系统。

    处理此问题的最佳方法通常是使用 API。

    使用正在生成的 API 端点创建后端。这可以通过Flask Restful 完成。 API 端点基本上会生成 JSON 格式的数据。

    API 端点可以被前端 React JS 使用。我没有链接,但我相信网上有很多资源。

    现在,如果您需要在 ReactJS 端更改特定的 CSS 项目,您可以发送特定的标志来指示您需要更改的内容,然后您就可以处理逻辑。例如,您可以使用以下字段从后端生成端点:

    {
        "user-team": "blue" 
    }
    

    在 ReactJS 上,可以创建逻辑来检查这个特定字段并根据它更改特定元素的颜色。

    【讨论】:

    • 我已经把它作为一个 API 来做。我通过 axios GET 请求从 menu.html 获取每个模板,例如,从端点 /menu。你需要任何进一步的编辑来指定这个吗?
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 2019-06-18
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多