python中render的⽤法_使⽤表单和模板:tornado模板
前端页面模板
如果像前⾯那么做⽹站,也太丑陋了。并且功能也不多。
在实际做⽹站中,现在都要使⽤⼀个模板,并且在⽤户直接看到的页⾯,⽤html语⾔来写页⾯(关于HTML,本教程默认为看官已经熟悉,如果不熟悉,可以到有关教程来学习)。
在做⽹站的⾏业⾥⾯,常常将HTML+CSS+JS组成的⽹页,称作“前端”。它主要负责展⽰,或者让⽤户填写⼀些表格,通过JS提交给⽤python写的程序,让python程序来处理数据,那些处理数据的python程序称之为“后端”。我常常提醒做“后端”的,不要轻视“前端”。如果看官⽴志成为全栈⼯程师,就要从前到后都通。
在本讲中,为了突出模板和后端程序,我略去CSS+JS,虽然这样⼀来界⾯难看,⽽且⽤户的友好度也不怎么样(JS,javascript是使⽹页变得更友好的重要⼯具,如不⽤更换地址就能刷新页⾯等等,特别提醒看官,⼀定要学好javascript,虽然这个可能没有⼏个⼤学教的。请看对javascript简介:)。
> JavaScript,⼀种直译式脚本语⾔,是⼀种动态类型、弱类型、基于原型的语⾔,内置⽀持类。它的解释器被称为JavaScript引擎,为浏览器的⼀部分,⼴泛⽤于客户端的脚本语⾔,最早是在HTML⽹页上使
⽤,⽤来给HTML⽹页增加动态功能。然⽽现在JavaScript也可被⽤于⽹络服务器,如Node.js。
>
> 在1995年时,由⽹景公司的布兰登·艾克,在⽹景导航者浏览器上⾸次设计实作⽽成。因为⽹景公司与升阳公司合作,⽹景公司管理层次结构希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。
>
> 为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运⾏。为了统⼀规格,1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的⼯作组确定统⼀标准:ECMA-262。因为JavaScript兼容于ECMA标准,因此也称为ECMAScript。
上⾯这段引⽂⾥⾯提到了⼀个⾮常著名的公司:⽹景,可能年青⼀代都忘却了。也建议有兴趣的看官到中了解这个传奇公司,它曾经有⼀个传奇产品,虽然名字不复存在,但是Firefox是秉承它⾐钵的。
话题再转回来,还是关于本讲,主要是要演⽰⼀个⽤模板(HTML)写⼀个表单,然后提交给后端的pyth
on程序,再转到另外⼀个显⽰的前端页⾯显⽰。为了简化流程,这个过程中没有数据处理和CSS+Javascript的⼯作,所有界⾯会丑陋。但是,“我很丑,可是我很温柔”。
## ⼀个表单
要做⼀个前端的页⾯,显⽰的内容就如同下图样式
相应代码是,并命名为index.html,存在⼀个名称是template的⽬录中。
~~~
sign in your name
Please sing in.
Name:
Email:
Website:
Language:
~~~
上⾯的代码是⽐较简单,如果看官熟悉html的话,不熟悉也不要紧,⽹上搜索就能理解。注意,没有CSS+JS,所以简单。如果在真正开发中,这两个是不能少的。
有了这个表单之后,如果⽤户把相关信息都填写好了。点击下⾯的按钮,就应该提交给后端的python程序来处理。
## 后端处理程序
做为tornado驱动的⽹站,⾸先要能够把前⾯的index.html显⽰出来,这个⼀般⽤get⽅法,显⽰的样式就按照上⾯的样⼦显⽰。
⽤户填写信息之后,点击按钮提交。注意观察上⾯的代码表单中,设定了`post`⽅法,所以,在python程序中,应该有⼀个post⽅法专门来接收所提交的数据,然后把提交的数据在另外⼀个⽹页显⽰出来。
在表单中还要注意,有⼀个`action=/user`,表⽰的是要将表单的内容提交给`/user`路径所对应的程序来处理。这⾥需要说明的是,在⽹站中,数据提交和显⽰,路径是⾮常重要的。
按照以上意图,编写如下代码,并命名为usercontroller.py,保存在template⽬录中
~~~
#!/usr/bin/env python
#coding:utf-8
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
class UserHandler(tornado.web.RequestHandler):
def post(self):
user_name = _argument("username")
user_email = _argument("email")
user_website = _argument("website")
user_language = _argument("language")
handlers = [
(r"/", IndexHandler),
(r"/user", UserHandler)
]
template_path = os.path.join(os.path.dirname(__file__),"template")
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers, template_path)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
~~~
这次代码量多⼀些。但是多数在前⾯讲述tornado基本结构的时候已经说过了,跟前⾯⼀样,这⾥仅仅把重点的和新出现的进⾏讲述,如果看官对某些内容还有疑问,可以参考前⾯的相关章节。
在引⼊的模块上,多了⼀个`import os.path`,这个模块主要⽤在:
~~~
template_path = os.path.join(os.path.dirname(__file),"template")
~~~
这是要获取存放程序的⽬录`template`的路径。
重点看两个类中都有的`der()`,⽤这个⽅法引⼊相应的模板。
~~~
~~~
显⽰index.html模板,但是此时并没有向模板⽹页传递任何数据,仅仅显⽰罢了。下⾯⼀个:
~~~
~~~
与前⾯的不同在于,不仅仅是要引⽤模板⽹页user.html,还要向这个⽹页传递⼀些数据,例如username=user_name,含义就是,在模板中,某个地⽅是⽤username来标⽰得到的数据,⽽user_name是此⽅法中的⼀个变量,也就是对应⼀个数据,那么模板中的username 也就对应了user_name的数据,这是通过username=user_name完成的(说的有点像外语了)。后⾯的变量同理。
那么,user_name的数据是哪⾥来的呢?就是在index.html页⾯的表单中提交上来的。注意观察路径的设置,`r"/user", UserHandler`,也就是在form中的`action='/user'`,就是要将数据提交给UserHandler处理,并且是通过post⽅法。所以,在UserHandler类中,有post()⽅法来处理这个问题。通过_argument()来接收前端提交过来的数据,接收⽅法就是,_argument()的参数与index.html表单form中的各项的name值相同,就会得到相应的数据。例如`user_name = _argument("username")`,就能够得到index.html表单中name为"username"的元素的值,并赋给user_name变量。
还差⼀个⽹页。
## 显⽰结果
在上⾯的代码中,⼜多了⼀个模板:`index.html`,对这个模板,跟前⾯那个模板有⼀点⼉不⼀样的地⽅,就是要引⼊⼀些变量。它的代码是这样的:
~~~
sign in your name
Your Information
Your name is {{username}}
Your email is {{email}}
Your website is {{website}}, it is very good. This website is make by {{language}}
~~~
请将上⾯的代码和这句话对照:
~~~
~~~
上⾯的模板代码存储为名为`user.html`的⽂件,并且和前⾯已经保存的在同⼀个⽬录中。
看HTML模板代码中,有类似`{{username}}`的变量,模板中⽤`{{}}`引⼊变量,这个变量就是在`der()`中规定的,两者变量名称⼀致,对应将相应的值对象引⼊到模板中。
## 运⾏结果
进⼊到template⽬录,执⾏:
~~~
qw@qw-Latitude-E4300:~/template$ python userscontroller.py
~~~
然后在浏览器的地址栏中输⼊
~~~
~~~
出现如下图的表单,并填写表单内容
点击“按钮”之后:
这样就实现了⼀个简单表单提交的⽹站。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。