web开发方法,Web开发技术教程

  web开发方法,Web开发技术教程

  

  一、从 hello, world 开始

  如果您的python环境中没有安装tornado,请使用pip直接安装:

  下面这段pipinstalltornado的代码,虽然只有六行(不包括两行导入模块),却是一个完整的web服务程序。运行以下代码启动web服务,并从本地浏览器直接访问http://127.0.0.1。不出意外,我们的第一个网页,hello,world,可以正常显示了。

  demo.py

  #-*-编码:utf-8-*-

  importtornado.ioloop

  importtornado.web

  class home handler(tornado . web . request handler):

  Get (self) : #响应Get发送的请求。

  Self.write(hello,world)#回复请求者hello,world(浏览器)

  app=tornado . web . application([(r /,HomeHandler),]) # URL映射

  App.listen(80)#绑定监听端口

  Tornado.ioloop.ioloop.instance()。Start () #启动服务。如果你对http协议和get/post方法有所了解,相信你一定能看懂。也许您的项目计划了很多URL,或者您的服务需要监控非80端口。没关系,在这段代码上扩展一下就行了。只有六行!请让我们向犀利、简洁、万能的python致敬!

  重要:tornado . web . request handler . write()不仅可以接受字符串参数,还可以接受列表或字典参数3354。如果响应类型是json,那么这个重载特性是非常高效的。

  二、最简单的登录

  假设我们有这样一个web服务需求:

  (1)首页:地址“/”,显示两个汉字“点击此处登录”。点击跳转到登录页面;

  (2)登录页面:get访问的地址"/login ",会显示账号、密码输入框和登录按钮;通过post方式访问,然后提交表单提交并验证登录信息。登录成功,跳转到个人信息页面,否则,跳转到首页;

  (3)个人信息页面:地址“/我”,显示登录账号。

  基于上面的代码,我们需要做的第一件事是将URL与相应的处理类关联起来。这份工作实际上非常轻松愉快:

  app=tornado.web.Application([

  (r/,HomeHandler),

  (r/login ,LoginHandler),

  (r/me ,MeHandler)

  ])接下来,我们将实现三个类:HomeHandler、LoginHandler和meHandler。通常我们习惯将这些URL对应的处理类保存为一个独立的文件,比如handlers.py,然后在服务器脚本demo.py中导入

  handlers.py

  #-*-编码:utf-8-*-

  importtornado.web

  class home handler(tornado . web . request handler):

  响应主页请求

  Get (self) : #请获取

  求

  self.write("""<!DOCTYPEhtml><html><body><ahref="login">点此登录</a></body></html>""")

  classLoginHandler(tornado.web.RequestHandler):

  """响应登录页请求"""

  

  defget(self):#以get方式请求

  self.write(

  """

  <!DOCTYPEhtml><html><body><formmethod="POST"action="/login">

  账号:<inputtype="text"name="account"value=""/><br/>

  密码:<inputtype="password"name="passwd"value=""/>

  <inputtype="submit"value="确定"/>

  </form></body></html>

  """

  )

  

  defpost(self):#以post方式请求(本例为提交表单)

  account=self.get_argument('account',None)

  passwd=self.get_argument('passwd',None)

  

  ifaccount=='xufive'andpasswd=='dgdgwstd':

  self.redirect('/me?name=%s'%account)

  else:

  self.redirect('/')

  classMeHandler(tornado.web.RequestHandler):

  """响应个人信息页请求"""

  

  defget(self):#以get方式请求

  name=self.get_argument('name',None)

  ifname:

  self.write(

  """

  <!DOCTYPEhtml><html><head><metacharset="UTF-8"/></head>

  <body>欢迎你来到这里,%s</body></html>

  """%name

  )

  else:

  self.redirect('/')相应地,服务脚本变成了这样:

  demo.py

  

#-*-coding:utf-8-*-

  importos

  importtornado.ioloop

  importtornado.web

  fromtornado.optionsimportparse_command_line

  fromhandlersimport*

  parse_command_line()

  app=tornado.web.Application(

  handlers=[

  (r"/",HomeHandler),

  (r"/login",LoginHandler),

  (r"/me",MeHandler)

  ],

  template_path=os.path.join(os.path.dirname(__file__),'templates')

  )

  app.listen(80)#绑定侦听端口

  tornado.ioloop.IOLoop.instance().start()#启动服务

划重点:tornado.web.RequestHandler.get_argument() 可以读取通过表单和QueryString传递的参数。

  三、模板技术

  读到这里,你一定会觉得奇怪:为什么服务端程序里面混杂了一大堆的 html 代码?Don’t worry,以上的代码仅仅是帮助你建立基本概念的,实际上,tornado 是为数不多的支持模板技术很到位的框架之一,其模板技术不仅支持继承,支持子模版。让我们一步一步讨论如何使用模板。

  第1步:模板保存在哪儿?

  在服务端脚本里,当我们使用 tornado.web.Application() 创建一个应用时,通常需要传递一个 template_path 参数,这个参数就是模板文件的保存路径。上面的例子已经增加了这个参数,我们只要把模板文件放在和 demo.py 同级的 templates 文件夹下就可以了。

  第2步:怎样写模板?

  其实,模板就是 html 文件,只是其中混杂了少量特别约定的符号。一个 web 项目,通常由若干页面组成,这些页面有很多共同的地方,因此一个基类模板是必要的。

  base.html

  

<!DOCTYPEhtml>

  <html>

  <head>

  <metacharset="utf-8">

  <!--此处省略各种样式表文件-->

  </head>

  <body>

  {%blockblock_body%}{%end%}

  </body>

  <html>

基类模板 base.html 定义了一个 block_body 容器,如果有必要,我们在基类模板的任意位置定义更多的容器。假定我们需要一个个人信息页模板,可以直接继承 base.html,然后只填写 block_body 这一部分就行了。

  me.html

  

{%extends"base.html"%}

  {%blockblock_body%}

  <h1>欢迎你来到这里,{{name}}</h1>

  {%end%}

个人信息页模板引中,我们使用 {{}} 引用了一个变量 name。

  第3步:如何使用模板?

  很简单,前面我们用 tornado.web.RequestHandler.write() 向浏览器应答信息,现在则是这样使用模板:

  

classMeHandler(tornado.web.RequestHandler):

  """响应个人信息页请求"""

  

  defget(self):#以get方式请求

  name=self.get_argument('name',None)

  ifname:

  self.render('me.html',name=name)

  else:

  self.redirect('/')

常用的模板语法汇总,如下:

  (1)引用变量:{{…}}

  (2)引用 python 表达式:{%…%}

  (3)循环:{% for var in expr %}…{% end %}

  (4)分支:{% if condition %}…{% elif condition %}…{% else %}…{% end %}

  (5)引用原生表达式:{% raw expr %}

  四、Cookie 演练

  tornado.web.RequestHandler 的 cookie 操作非常灵活,下面的 handler 展示了 cookie 的基本读写方法:

  

classCookieHandler(tornado.web.RequestHandler):

  defget(self):

  visit_num=self.get_cookie('visit_num')

  ifnotvisit_num:

  visit_num='0'

  visit_num=str(int(visit_num)+1)

  #self.set_cookie('visit_num',visit_num,expires=None)#内存cookie

  self.set_cookie('visit_num',visit_num,expires=time.time()+1000)#持久化的cookie

  self.write("这是您第%s次访问本页面"%visit_num)

如果我们要使用持久化的 Cookie(硬盘 Cookie),为了防止被破解,一般是要加密的,那么,在 tornado.web.Application 中需要设置 cookie_secret 项(加密因子)。

  定义tornado.web.Application,这是我最常用的一个模式:

  

classApplication(tornado.web.Application):

  def__init__(self):

  handlers=[

  (r"/",WelcomeHandler),#欢迎信息

  (r"/server_time",ServerTimeHandler)#显示服务器时间

  ]

  settings=dict(

  title=u"网站名称",

  template_path=os.path.join(os.path.dirname(__file__),'templates'),

  static_path=os.path.join(os.path.dirname(__file__),'static'),

  cookie_secret='rewqr4gfd654fdsg@$%34dfs',

  session_expiry=0,

  login_url="/",

  debug=1

  )

  

  tornado.web.Application.__init__(self,handlers,**settings)

五、Session 扩展

  为 tornado 增加 session 机制,基本思路就是从 tornado.web.RequestHandler 派生新类,重写 initialize() 方法。当类实例被构造函数创建后,会先运行该方法。我们定义 initialize() 方法读取名为 session_id 的 cookie,如果存在,则读取以 session_id 命名的 session 文件,取得 session 内容,否则,session 为空。

  众多python培训视频,尽在盛行IT软件开发工作室,欢迎在线学习!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: