一次tornado建站項目分享

下面是年前的一個tornado小型項目
前端效果主要是參照bootstrap官網模板
後端數據主要是經過ajax,post, get實現數據參數傳輸


css

注意點:1. tornado的csrf_token寫法形式與django有區別
    2. tornado在服務器上的掛載方式也略有區別
    3. ajax數據傳輸用 json
html


項目代碼很簡單,就不班門弄斧了。直接上注意點:
前端

注意點1:tornado csrf的生成方式以及取值方式

<form class="form-signin">
    {% module xsrf_form_html() %} //csrf_token
    <img class="mb-4" src="/static/img/god.ico" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
    <label for="inputEmail" class="sr-only">Username</label>
    <input type="text" id="inputEmail" class="form-control" name="username" placeholder="Username" required
           autofocus>
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" name="password" placeholder="Password" required>
    <div class="checkbox mb-3">
        <label>
            <input type="checkbox" id="Choice" value="remember-me" checked> Remember me
        </label>
    </div>
    <input class="btn btn-lg btn-primary btn-block" id="login" type="button" value="Sign in">
    <span class="error"></span>
    <p class="mt-5 mb-3 text-muted">&copy; 2019-2010</p>
</form>
$("#login").click(
            function () {
                var n = $('#Choice').prop('checked');
                $.ajax({
                    url: "",
                    type: 'post',
                    data: {
                        remeber: n,
                        username: $("[name='username']").val(),
                        password: $("[name='password']").val(),
                        _xsrf: $("[name='_xsrf']").val()
                    },
                    success: function (data) {
                        if (data === "1") {
                            console.log("ok");
                            location.href = '/LoginWin'
                        }
                        else {
                            $(".error").text("Error: 請檢查 帳號 or 密碼 是否正確").css({"color": "red", "margin-left": "10px"});
                            setTimeout(function () {
                                $(".error").text('');
                            }, 1000)
                        }

                    }
                })
            })

 

注意點2: 關於tornado項目掛載服務器,後臺運行的方式關閉遠程鏈接之後,該項目進程會死掉,解決方法需fork進程,在項目執行的地方加上這段就Ok了

def daemon(): 
    import os
    try:
        pid = os.fork()
        if pid > 0:
            return pid
    except OSError as error:
        return -1
    os.setsid()
    os.umask(0)
    try:
        pid = os.fork()
        if pid > 0:
            return pid
    except OSError as error:
        return -1
    sys.stdout.flush()
    sys.stderr.flush()
    si = open("/dev/null", "r")
    so = open("/dev/null", "ab")
    se = open("/dev/null", "ab", 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdin.fileno())
    os.dup2(se.fileno(), sys.stdin.fileno())
    return 0


def main():
    app = Application() # 項目啓動
    httpServer = tornado.httpserver.HTTPServer(app) # 項目啓動
    httpServer.bind(config.options["port"]) # 項目啓動
    httpServer.start(1) # 項目啓動
    tornado.ioloop.IOLoop.current().start() # 項目啓動
    pid = daemon() # fork進程
    if pid:
        return pid


if __name__ == '__main__':
    main()
相關文章
相關標籤/搜索