使用React和Flask静态模板渲染CSS

时间:2019-07-11 05:52:00

标签: javascript html css reactjs flask

我有一个React-Flask项目,该项目需要为一些后端端点呈现静态内容。这是我的简化结构:

client/
    src/
        components/
            Menus.jsx
    public/
        bg.png
        index.html
        manifest.json          
web/
    project/
        api/
            routes/
                static/
                    css/
                        bootstrap.css
                        mug.css
                    templates/
                        menu.html
                        partials/
                            head.html

反应前端

因此,如果我尝试渲染静态的menu.html页面,我将通过ajax GET获取并使用Jinja2直接从Flask注入我的dangerouslySetInnerHTML模板,就像这样:

Menus.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>
    );       
}

index.html,我将一些常规css与bulma链接:

Index.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
        <meta name="viewport"
              content="width=device-width, initial-scale=1, shrink-to-fit=no"
        />
        <meta name="theme-color" content="#000000" />

        <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
        <link href="//cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css"rel="stylesheet">
        <title>App</title>
    </head>

    <body>
        <style>
            body {
                background-color: #C86428;
                background-image: url("bg.png");
                background-position: 0 5;
                opacity: 1.0;
                height: 120vh;
            }
        </style>
        <div id="root" />
    </body>
</html>

烧瓶后端

在这里,我尝试在css处链接我的静态head.html

head.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link type="text/css" href="{{url_for('static', filename='css/bootstrap.css')}}">
    <link type="text/css" href="{{url_for('static', filename='css/mug.css')}}">
</head>
<body>

然后在插入的模板顶部通过css插入partials/head.html,如下所示:

menus.html

{% include 'partials/head.html' %}
<section id="woz-content" >
    <body>

        <div className="container">
            <ul style="list-style:none" >
                <li><a href="{{ url_for('loading',name=items[0])}}";><font color="#C86428">{{ item[0] }}</font></a>
                    <form action="{{ url_for('menus.handle_menu', user_id=user_id) }}" method="post">
                        <input type="radio" name="additive" value="additive1" style="font-size:10px"> <label style="font-size: 11px;"><font color="#C86428">Additive 1</font></label>   
                        <input type="submit" value="add" >
                    </form></li>
                (...)

loading.html

{% include 'partials/head.html' %}

<div class="cup">
    <div class="coffee"></div>
</div>

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

<script> 
    window.location.replace('/item/{{name}}');
</script>

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/mug.css没有被应用在最前端。我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

您需要在index.html中指定下面的URL,而不是head.html

<link type="text/css" href="{{url_for('static', filename='css/bootstrap.css')}}">
<link type="text/css" href="{{url_for('static', filename='css/mug.css')}}">