那年坑系列之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/

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

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

原文地址:https://www.cnblogs.com/erjuan/p/6435887.html