• 那年坑系列之Tornado的路径_by二卷


    keywords: Tornado url 路径


    **重要的事情说三遍:文件夹不能用中文名字、文件夹不能用中文名字、文件夹不能用中文名字(否则有稀奇古怪的错误,我就说失误把总文件夹命名成中文才出现莫名其妙的问题)** **师父说程序员最后一点气质都被我丢光了,啊呜!0_0**

    二卷的自言自语: 这个坑呢,其实二卷已经掉过一次,当时不知道怎么爬上来的,是要在html里面引入一个图片,但是路径没写对,后来对了。但是好了伤疤忘了痛,在html中引入js文件时,我又犯了相同的错误。以至于耗时了一天多,还找了师父和斯基帮忙,最后我哥帮我检查的时候才发现的,一天多啊,都可以逛个街吃顿大餐然后看个电影了啊!!!二卷其实内心是奔溃的!不过昨天已经罚自己晚上不能看剧了,好了言归正传,接下来讲一下这个坑。虽然我是很蠢的,但是我坚信我不是最蠢的……0_0

    ------------------我是蒙圈的分割线---------------------------


    知识点

    1.静态内容的文件

    1.一般来说,我们会把样式表、js文件、图片等存在在一个文件夹中,通常定义该文件夹为static

    2.在Tornado有个settings的参数中可以设置static_path,来指定static的文件位置(具体设置办法可以见接下来的code)

    3.settings的参数中还可以设置static_url_prefix
    (1).这其实是一个别名,通常会写作/XXXX/(注:左右俩个/不能少,默认是/static/

    (2).可能酱紫讲不太明白,接下来的code中有演示,先通俗的解释一下就是在html中要引入静态文件中的某个图片或者文件的话直接写src="/XXXX/文件名"就可以了
    4.Tornado模板模块提供了一个叫作static_url的函数来生成static目录下文件的URL,例如在需要src=XXX的地方写上

    <script src = "{{ static_url("XXXXX.js") }}" type="text/javascript"></script>
    


    问题描述

    1.目录结构

    2.具体代码

    ScoringWebServer 文件

    #!/usr/bin/python
    # -*- encoding:utf-8 -*-
    
    import os
    import tornado.web
    import tornado.ioloop
    import tornado.httpserver
    
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    from email.utils import parseaddr, formataddr
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr(( 
            Header(name, 'utf-8').encode(), 
            addr.encode('utf-8') if isinstance(addr, unicode) else addr))
    
    def sendEmailCode(userEmail, content):
        emailContent = MIMEText(content, 'plain', 'utf-8')
        emailContent['From'] = _format_addr(u'AAA<AAA@BB.com>')
        emailContent['To'] = _format_addr(u'Dear science researcher<' + userEmail + '>')
        emailContent['Subject'] = Header('NSFBWET registration ', 'utf-8').encode()
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("AAA@BB.com", "fgafg")#换成你发送邮件的邮箱和密码
        server.sendmail("AAA@BB.com", [userEmail], emailContent.as_string())
        server.quit()
    
    # Sign up
    class SignUpRequestHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('SignUp.html')
    
    class SendEmailCodeRequesHandler(tornado.web.RequestHandler):
        def post(self):
            emailCode = u"1223"
            email = self.get_argument('userEmail', None)
            if email:
                sendEmailCode(email, emailCode) # send EmailCode to a e-mail address
    
    
    # some settings
    settings = {
        'template_path': os.path.join(os.path.dirname(__file__),'../pages'), # '../pages' also work which is relative path
        'static_path': '../static',
        'static_url_prefix': '/YoYoYo/',
        'cookie_secret': 'IrSoXERAQ7mxqeZkTHMmDaOUc0+MiUGroDFhBEgWCag=',
        "xsrf_cookies": True
    }
    
    if __name__ == '__main__':
        # url settings
        Scoring = tornado.web.Application(handlers=
                                          [(r'/signup', SignUpRequestHandler), #sign up
                                           (r"/send_emailcode", SendEmailCodeRequesHandler),
                                           ], **settings)
        http_server = tornado.httpserver.HTTPServer(Scoring)
        http_server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
    
    

    SignUp.html 文件(精简了一下,所以看上去比较粗糙)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1.0">
    
        <link rel="stylesheet" href="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css"/>  
        <script src="https://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
        <script src="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <script src="../static/ScoringWeb.js" type="text/javascript"></script>
    
    </head>
    <body >
        <div class="container col-md-5 col-xs-5 col-center-block ">
            <form class="form-signin" role="form" method="post" action="/">
            {% raw xsrf_form_html() %}
            <input id="email" type="email" class="form-control" placeholder="Email address" required="required" autofocus="autofocus">
            <input class="form-control" placeholder="Email check code" >
            <input id="emailCode" type="button" onclick="SendCode();" value="send verification"/>
            </form>
        </div>
    
    </body>
    
    </html>
    

    ScoringWeb.js 文件

    function getCookie(name)
    {
        var c = document.cookie.match("\b" + name + "=([^;]*)\b");
        return c ? c[1] : undefined;
    }
    function SendCode()
    {
        var email = $('#email').val();
        $.ajax({
            url: '/send_emailcode',
            type: 'POST',
            data: {userEmail: email, '_xsrf':getCookie('_xsrf')},  
        });
    }
    

    ------------------高能预警,问题来了,但是宝宝不要怕0_0--------------------------

    • 运行.py文件-> http://localhost:8888/signup ->F12,会报错说:Uncaught ReferenceError: SendCode is not defined
      at HTMLInputElement.onclick
    • 其实这个问题就是我的js文件没有引入对,不运行py文件单独html这时候其实是可以调用static中的js文件的
    • 二卷我就纳了个闷,开始怀疑我的js中的函数写的有问题,检查来检查去,后来发现是引入的路径不对。别的服务器框架我不知道,但是Tornado在引入静态文件的时候一定记得路径要写对!!!!!


    问题解决

    错误来源:就html文件中这一句

    <script src="../static/ScoringWeb.js" type="text/javascript"></script>
    

    改成

    <!--也就是我们上面说到的static_url模板模块,而且貌似Tornado不区分路径的大小写的-->
    <script src="{{ static_url('scoringweb.js')}}" type="text/javascript"></script>
    
    <!--也可以使用别名-->
    <script src="/YoYoYo/ScoringWeb.js" type="text/javascript"></script>
    

    最后要说的是注意我的目录结构哦
    一边码字一边思考,我觉得我还是蛮累的……hihahiha,二卷功力快蹭蹭长!





    -------------------------------------------我是求打赏的分割线-------------------------------------------

    大海中的一颗星辰,天空中的一枚卷花

    作者:二卷

    出处:http://www.cnblogs.com/erjuan/

    本文版权归二卷和博客园共有,欢迎转载,但未经二卷同意必须保留此段声明哦,且在文章页面位置给出二卷的原文连接

    有错误的话也可以联系二卷指正哦(鞠躬)

  • 相关阅读:
    浅谈sqlserver数据库优化(一)----开光篇
    代码生成器的意愿
    面试的那些小事。
    Access和Sql区别
    牢记!SQL Server数据库开发的二十一条注意点
    SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
    ResponseUtil jackson 转换问题;返回结果与 Bean 之间的转换,推荐使用convertValue
    阿里巴巴 ali1688 Date +0800的问题
    Spring Boot 全局异常。RestControllerAdvice,ControllerAdvice
    controller 层 date 类型的参数,SpringBoot自动转换 dateformat
  • 原文地址:https://www.cnblogs.com/erjuan/p/6435887.html
Copyright © 2020-2023  润新知