• 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

  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/5494932.html
Copyright © 2020-2023  润新知