• 一次tornado建站项目分享


    下面是年前的一个tornado小型项目
    前端效果主要是参照bootstrap官网模板
    后端数据主要是通过ajax,post, get实现数据参数传输


    注意点:1. tornado的csrf_token写法形式与django有区别
        2. tornado在服务器上的挂载方式也略有区别
        3. ajax数据传输用 json


    项目代码很简单,就不班门弄斧了。直接上注意点:

    注意点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()
  • 相关阅读:
    vue播放mu38视频兼容谷歌ie等浏览器
    cube-slide组件的应用
    cube-ui按钮配合toast单例模式应用
    vue网页添加水印
    element ui 下拉框绑定对象并且change传多个参数
    VUE 同一页面路由参数变化,视图不刷新的解决方案
    MySQL Out-of-Band 攻击
    mysql load_file在数据库注入中使用
    Handy Collaborator :用于挖掘out-of-band类漏洞的Burp插件介绍
    基于时间的 SQL注入研究
  • 原文地址:https://www.cnblogs.com/cjj-zyj/p/10360946.html
Copyright © 2020-2023  润新知