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,二卷功力快蹭蹭长!