zoukankan      html  css  js  c++  java
  • python练习五—简单web应用

    配置apache

    我以前web开发基本都是基于java平台的,比如tomcat,servlet等等,由tomcat接收http请求,然后交给servlet处理,servlet处理完成以后把返回结果交给tomcat,由tomcat返回给客户端,这次学习python CGI的时候首先想到的是CGI的圆形原理是什么,怎么处理一次完整的http请求?过程如下:

    1. 客户端发起http请求
    2. apache接收http请求
    3. apache(必须加载了对应的处理模块,如处理python的mod_cgid.so)交给编写好的python脚本处理
    4. python脚本接受参数并输出一个http页面
    5. apache将这些输出返回给客户端

    和我们熟悉的servlet处理相比是相当类似的,但是还有两个问题没有解决:

    • tomcat和apache的区别是什么?
    • apache怎么知道把请求交给python处理(即apache的配置)

     tomcat和apache的区别

    在此不进行复杂的比较,在此列中我只需要知道:

    1. apache是一个高效的http静态服务器,用来处理静态页面的请求(如果需要处理动态请求需要加载对应模块,比如php,perl)
    2. tomcat是一个java应用服务器,可以处理静态请求,也可以处理servlet

    配置apache可以处理pyton脚本

    1. 首先安装apache2自不必说,目前大多数linux发行版应该自带了apache2
    2. 配置apache2.conf(有些可能是httpd.conf,可以使用locate定位该文件的位置),修改如下
    # apache2.conf配置
    
    # 加载处理python cgi的模块,必须有
    LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so
    # 一定要注意配置的服务器根目录是是什么,我的是/var/www
    # 告诉apache2访问
    /cgi-bin/的时候去 /var/www/cgi-bin/找脚本,注意要有'/' ScriptAlias /cgi-bin/ /var/www/cgi-bin/ # 对python脚本所在目录进行配置 <Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all AddHandler cgi-script cgi </Directory> # 识别cgi脚本后缀 AddHandler cgi-script .cgi .py

    测试配置

    好的姿势都摆好了,可以写一个示例试试配置是否成功。

    编写一个python脚本

    在/var/www/cgi-bin/目录下新建一个test.py

    #!/usr/bin/env python
    # -*- coding=utf-8 -*-
    
    import cgi
    import cgitb;
    cgitb.enable()
    
    print "Content-type:text/html"
    print    # 注意此处必须加print打印出一个空行,否则CGI无法解析
    print """<HTML>
    <HEAD>
    <TITLE>CGI Environment</TITLE>
    </HEAD>
    <BODY>"""
    cgi.print_environ()
    print "</BODY></HTML>"

    修改脚本权限

    # 特别注意我使用root用户直接登陆的,此处为了简单起见使用了777,在实际配置重中这是非常不安全的
    chmod 777 test.py

    启动apache 服务

    # 有些可能是httpd
    service apache2 start

    在浏览器中查看页面

    在浏览器中输入:localhost/cgi-bin/test.py

    看到下面内容(只要有内容就行,具体内容不一定一样)说明配置成功了

    Shell Environment:
    
    CONTEXT_DOCUMENT_ROOT
        /var/www/cgi-bin/ 
    CONTEXT_PREFIX
        /cgi-bin/ 
    DOCUMENT_ROOT
        /var/www/html 
    ....(此处为省略的内容)
        ::1 
    SERVER_ADMIN
        webmaster@localhost 
    SERVER_NAME
        localhost 
    SERVER_PORT
        80 
    SERVER_PROTOCOL
        HTTP/1.1 
    SERVER_SIGNATURE
        <address>Apache/2.4.10 (Debian) Server at localhost Port 80</address> 
    SERVER_SOFTWARE
        Apache/2.4.10 (Debian) 
    View Code

    在线编辑器

    以上是python web学习之前的一些环境搭建工作,以下是一个简单的pyhton CGI程序,完成一个在线编辑器的功能,可以打开文件,编辑文件,保存文件(需要输入密码)。

    整个功能比较简单,不再对详细过程解释,代码如下:

    首页

    <html>
      <head>
        <title>editor</title>
      </head>
      <body>
        <form action='edit2.py' method='POST'>
          <b>file name</b>
          <input type='text' name='filename' />
          <input type='submit' value='open' />
      </body>
    </html>
    View Code

    编辑页面

    #!/usr/bin/env python
    #-*- coding=utf-8 -*-
    
    import cgi
    import sys
    from os.path import join, abspath
    
    
    # 先 输出头信息,便于后面的信息能正常输出
    print """Content-type: text/html"""
    
    # 文件所在目录
    BASE_DIR = abspath('data')
    
    form = cgi.FieldStorage()
    
    filename = form.getvalue('filename')
    
    if not filename:
        print 'please input a filename'
        sys.exit()
    
    text = open(join(BASE_DIR, filename)).read()
    
    print """
    <html>
      <head>
        <title>editing</title>
      </head>
      <body>
        <form action='save.py' method='POST'>
          <b>File: %s</b> </br>
          <input type='hidden' value='%s' name='filename' />
          <b> Password :</b><br />
          <input type='password' name='password' /><br />
          <b>Text: </b> <br />
          <textarea column='20' row='10' name='text'>%s</textarea> </br>
          <input type='submit' value='save' />
        </form>
      </body>
    </html>
    """ %  (filename, filename, text)
    View Code

    保存页面

    #!/usr/bin/env python
    #-*- coding=utf-8 -*-
    
    import cgi
    import sys
    from os.path import join, abspath
    
    
    # 先输出头信息,便于后面的输出正常
    print "Content-type: text/html
    "
    
    # 文件所在目录
    BASE_DIR = abspath('data')
    
    form = cgi.FieldStorage()
    
    text = form.getvalue('text')
    filename = form.getvalue('filename')
    password = form.getvalue('password')
    
    # 检查参数是否为空
    if not (text and filename and password):
        print 'invalid params'
        sys.exit()
    # 验正密码
    if password != '123':
        print 'invalid params'
        sys.exit()
    
    f = open(join(BASE_DIR, filename), 'w')
    f.write(text)
    f.close()
    
    print 'the file have been saved'
    View Code

    注意:

    1. 在/var/www/cgi-bin/data下面新建文件edit2.dat,该文件一定是可读可写的
    2. 将以上三个页面复制到cgi-bin目录下,脚本记得修改权限,当前用户必须是可读可执行的
    3. 编写pyhton脚本的时候,返回的html包含header信息的时候,header前面不能有空行,header和正文之间必须有空行

    代码位置

    http://pan.baidu.com/s/1bo5z4pL

  • 相关阅读:
    【笔记】黄如花.信息检索.学习心得
    【心得】Lattice和Xilinx工具关键特性对比(Diamond、ISE)
    【导航】FPGA相关
    【笔记】黄如花.信息检索.前4章心得(新增大牛汇总的公开课资源)
    python正则表达式练习题
    python正则表达式(1)--特殊字符
    【转】什么时候 i = i + 1 并不等于 i += 1?
    Linux查看文件指定行数内容
    python mysqldb批量执行语句executemany
    linux命令行常用快捷键
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/5494932.html
Copyright © 2011-2022 走看看