zoukankan      html  css  js  c++  java
  • python web.py安装使用

    官方首页:http://webpy.org/) 

    它的源代码非常整洁精干,学习它一方面可以让我们快速了解python语法(遇到看不懂的语法就去google),另一方面可以学习到python高级特性的使用(譬如反射,装饰器),而且在webpy中还内置了一个简单HTTP服务器(文档建议该服务器仅用于开发环境,生产环境应使用apache之类的),对于想简单了解下HTTP服务器实现的朋友来说,这个是再好不过的例子了(并且在这个服务器代码中,还可以学习到线程池,消息队列等技术),除此之外webpy还包括模板渲染引擎,DB框架等等,这里面的每一个部分都可以单独拿出来学习. 

    在JavaWeb开发中有Servlet规范,那么Python Web开发中有规范吗? 
    答案就是:WSGI,它定义了服务器如何与你的webapp交互 

    关于WSGI规范,可以参看下面这个链接: 
    http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html  (非常好的web.py源码学习:

    【Python】Webpy 源码学习(一)

    安装:

    安装web.py, 请先下载:

    http://webpy.org/static/web.py-0.37.tar.gz
    

    或者获取最新的开发版:

    https://github.com/webpy/webpy/tarball/master
    

    解压并拷贝 web 文件夹到你的应用程序目录下。 或者,为了让所有的应用程序都可以使用,运行:

    python setup.py install (
    

    注意: 在某些类unix系统上你可能需要切换到root用户或者运行:

    sudo python setup.py install
    

    查看 推荐设置.

    另外一个选择是使用Easy Install. Easy Install 使用如下:

    easy_install web.py
    

    或者 PIP

    sudo pip install web.py

    我下的是0.37版本。

    建立一个hello.py:
    import web
     
    urls = ('/hello', 'hello',
           )
     
    class hello(object):
      def GET(self):
        return 'hello world'
     
    if __name__ == "__main__":
      app = web.application(urls, globals())
      app.run()

    urls是映射规则(类似servlet映射)。hello是请求处理。

    运行该文件:

    python hello.py

    我运行报错:

    F:pythonSource>python webpyFirst.py
    Traceback (most recent call last):
    File "webpyFirst.py", line 12, in <module>
    app.run()
    File "D:ProgramFilespython2.7libsite-packageswebapplication.py", line 31
    3, in run
    return wsgi.runwsgi(self.wsgifunc(*middleware))
    File "D:ProgramFilespython2.7libsite-packageswebwsgi.py", line 55, in ru
    nwsgi
    server_addr = validip(listget(sys.argv, 1, ''))
    File "D:ProgramFilespython2.7libsite-packagesweb et.py", line 108, in va
    lidip
    if validip6addr(ip): return (ip,port)
    File "D:ProgramFilespython2.7libsite-packagesweb et.py", line 33, in val
    idip6addr
    socket.inet_pton(socket.AF_INET6, address)
    AttributeError: 'module' object has no attribute 'inet_pton'

    解决方法,修改Python安装目录下Libsite-packagesweb et.py文件的第32到第35行:

    (原来的是:

        try:
            socket.inet_pton(socket.AF_INET6, address)
        except socket.error:
            return False

    )

    改成:

    try:  
        socket.inet_pton(socket.AF_INET6, address)  
    except:  
        return False  

    参考:https://github.com/webpy/webpy/pull/195#issuecomment-19143945

    改正后运行下面的命令:

    F:pythonSource>python webpyFirst.py
    http://0.0.0.0:8080/

    输入网址http://0.0.0.0:8080/ 可是访问不了,网上搜了下可以指定ip:host,例如python hello.py 127.0.0.1:1234 即可正常访问。

    输入:

    127.0.0.1:1234/hello

    即可输出hello world.

    后来发现,不指定参数,直接用localhost也可以访问:

    http://localhost:8080/hello

    官方教程:http://webpy.org/tutorial3.zh-cn

    任何网站最重要的部分就是它的URL结构。你的URL并不仅仅只是访问者所能看到并且能发给朋友的。它还规定了你网站运行的心智模型。在一些类似del.icio.us的流行网站 , URL甚至是UI的一部分。 web.py使这类强大的URL成为可能。

    在开始你的web.py程序之前,打开一个文本文件(文件名为code.py)输入:

    import web
    

    这条语句会导入web.py模块。

    现在我们需要把我们的URL结构告诉web.py。让我从下面这个简单的例子开始:

    urls = (
      '/', 'index'
    )
    

    第一部分是匹配URL的正则表达式,像//help/faq/item/(d+)等(d+将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。第二部分是接受请求的类名称,像indexviewwelcomes.hello (welcomes模块的hello类),或者get_11 会被正则表达式捕捉到的内容替换,剩下来捕捉的的内容将被传递到你的函数中去。

    这行表示我们要URL/(首页)被一个叫index的类处理。

    现在我们需要创建一个列举这些url的application。

    app = web.application(urls, globals())
    

    这会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类

    code.py:

    import web
    
    urls = (
        '/', 'index'
    )
    
    class index:
        def GET(self):
            return "Hello, world!"
    
    if __name__ == "__main__":
        app = web.application(urls, globals())
        app.run()

    模板

    在 Python 中写 HTML 不是聪明的选择,相反在 HTML 中写 Python 则有趣的多。幸运的是,web.py 让这件事情做得简单而又漂亮。

    注意: 老版本的 web.py 使用 Cheetah 模板系统,你可以也欢迎使用其他模板系统,但它可能不会被长久支持。

    给模板新建一个目录(命名为 templates),在该目录下新建一个以 .html 结尾的文件,内容如下:

    <em>Hello</em>, world!
    

    你也可以在模板中使用 web.py 模板支持代码:

    $def with (name)
    
    $if name:
        I just wanted to say <em>hello</em> to $name.
    $else:
        <em>Hello</em>, world!
    

    如上,该模板看起来就像 python 文件一样,除了顶部的 def with (表示从模板将从这后面取值)和总是位于代码段之前的$。当前,template.py 首先请求模板文件的首行 $def 。当然,你要注意 web.py 将会转义任何任何用到的变量,所以当你将 name 的值设为是一段 HTML 时,它会被转义显示成纯文本。如果要关闭该选项,可以写成 $:name 来代替 $name

    回看再看 code.py。在第一行之下添加:

    render = web.template.render('templates/')
    

    这会告诉web.py到你的模板目录中去查找模板。然后把 index.GET改成: 告诉 web.py 在你的模板目录下查找模板文件。修改 index.GET :

    name = 'Bob'    
    return render.index(name)
    

    ('index' 是模板的名字,'name' 是传入模板的一个参数)

    访问站点它将显示 hello Bob。

    但是如果我们想让用户自行输入他的名字,么办?如下:

    i = web.input(name=None)
    return render.index(i.name)
    

    访问 / 将显示 hello world,访问 /?name=Joe 将显示 hello Joe。

    URL 的后面的 ? 看起来不好看?修改下 URL 配置:

    '/(.*)', 'index'
    

    然后修改下 index.GET

    def GET(self, name):
        return render.index(name)
    

    现在访问 /Joe 看看,它会显示 hello Joe。

    如果学习更多关于 web.py 的模板处理,请访问 web.py 模板.

  • 相关阅读:
    寻找SQL注入点
    根域名服务器
    Solr 文章集成
    Android事件分发机制
    王自如与老罗的辩论赛谁赢了?!
    ACdream原创群赛(13)のwuyiqi退役专场 C True love
    使用JS对select标签进行联动选择
    c++代码赏析之类对象传參
    基因治疗的现状
    解决手机訪问站点时总体相对屏幕缩小问题?(已解决)
  • 原文地址:https://www.cnblogs.com/youxin/p/3559971.html
Copyright © 2011-2022 走看看