服务器端编程

Menu

  • 概念
  • 在windows server端需要配置apache,才能试用cgi-bin
  • 在服务器安装CGI脚本
  • 用户交互 (tutor3.py,tutor3.html,cgi.FieldStorage()) (未写完)
  • 下载文件(getfile.py没有写)
  • 上传文件(putfile.py没有写) 各平台&客户端中path里提取文件名
  • HTML&URL转义
  • Web状态保存(cookie)
  • 运行本地网络服务器

概念
  • 根据网络服务器的管理进行命名(如file.py)
  • 存放在网络服务器认可的目录下(如cgi-bin/)
  • 对服务器主目录需要修改权限(对所有人可读,可执行,不可写),linux下用chmod 755 filename;
  • 在某些服务器上可能需要在顶部带有#!pythonpath行。
  • 仅在有必要时配置sys.path,以便查找其它目录下的模块。
  • 如果服务器不接受DOS格式,则使用Unix换行符惯例。Unix换行符是/n,所以二进制下传送文本文件行尾发送的是/r/n需要转换。
  • 如有必要,冲洗输出缓冲,或周期性发送部分回复。
  • cgi的py文件向HTML发送的内容必须都转义
    • HTML转义: html.escape("<abc>") or cgi.escape("<abc>")
    • HTML转义的反转:html.unescape('<abc&gt') # 解析后是<abc>
    • url解析工具:urllib.parse.quote" or "urllib.parse.quote_plus"
    • urllib.parse.quote(“upload/index.txt”, "/") # 第二个参数里的符号不转义
    • url转义的反转义方法:urllib.parse.unquote_plus OR urllib.parse.unquote
    • 在HTML里的超链接如果有特殊符号,需要先转义:
      '<a href="http://lu.com?name=%s">aaa</a>' % urllib.parse.quote("<abc>")
    • 在urllib.parse中除了英文、数字、“_.-”其它都是不安全字符,都会转义。
import urllib
s = r"a@b*c/def\g... zzz"
print(urllib.parse.quote(s))   # quote 空格=="%20",  "/" == "/" 
print(urllib.parse.quote_plus(s)) # quote_plus空格=="+",   "/" == %2F
"""
quote       >  a%40b%2Ac/def%5Cg...%20zzz
quote_plus  >  a%40b%2Ac%2Fdef%5Cg...+zzz
"""

在windows server端需要配置apache,才能试用cgi-bin
【linux环境配置方法:】

在进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。

Apache 支持CGI 配置:

设置好CGI目录:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,并按照惯例,它被命名为/var/www/cgi-bin目录。

CGI文件的扩展名为.cgi,python也可以使用.py扩展名。

默认情况下,Linux服务器配置运行的cgi-bin目录中为/var/www。

如果你想指定其他运行CGI脚本的目录,可以修改httpd.conf配置文件,如下所示:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

在 AddHandler 中添加 .py 后缀,这样我们就可以访问 .py 结尾的 python 脚本文件:

AddHandler cgi-script .cgi .pl .py

其实稍微有一些编程基础的小伙伴,应该很快能根据这一段得知在Windows环境的配置方法,只有路径有一些些区别,具体如下:
[Windows环境配置方法:]

1、将:ScriptAlias /cgi-bin/ "/var/www/cgi-bin" 设置为实际的目录如:ScriptAlias /cgi-bin/ "D:/Apache/cgi-bin/"

2、将:<Directory "/var/www/cgi-bin">  

    AllowOverride None  
    Options None  
    Order allow,deny  
    Allow from all  
</Directory>
中的:<Directory "/var/www/cgi-bin"> 设置为实际目录,如:<Directory "D:/Apache/cgi-bin/">

# <以下是重点↓↓↓>
3、找到:AddHandler cgi-script .cgi之后,去掉前面的#号,并且在后面添加.py,如:AddHandler cgi-script .cgi .py

# <以下是重点↓↓↓> 
经过以上配置之后,将编写的python脚本文件,放到Apache目录下的cgi-bin中

# <以下是重点↓↓↓> 
在python文件中第一行配置python.exe路径:#!C:\Python3.5.2\python.exe

还有最重要的一点,在所有输出之前,先输出一个头

# <以下是重点↓↓↓> 
print("Content-type:text/html\n")


在服务器安装CGI脚本
  • 要把CGI脚本放在服务器认可的目录下
    • 而且需要将它们命名为可被服务器识别的CGI脚本。本地服务器需要把CGI脚本放在cgi-bin子目录下,文件名后缀为.py。如果放在webdir目录下,和html文件放在一起的话,则需要把后缀名改为:.cgi (需要根据具体服务器来具体配置。)
  • 执行CGI文件
    • 文件需要配置:任何用户都能执行脚本;
    • linux服务器下使用命令行:chmod 755 filename
  • CGI脚本需要在顶部添加特定的“#!”行
    • “#! 后面跟着的是服务器上解释器的路径”
    • “#!/usr/bin/python” (不用写引号)
    • 或是调用cnv程序,cnv在服务器环境变量($path)中推断python路径
  • 模块搜索路径配置
    • python通常默认搜索当前目录中的导入模块。
    • 如果放在其他目录,需要手动添加搜索目录:sys.path.append(dirname)

用户交互
  • 通过HTML的form input表格输入信息(POST模式):
<!--用户输入表单的 form模块, input表格输入,POST模式,发送给cgi-bin/mytutor.py,
mytutor模块里的cgi.FieldStorage()接收数据-->
<html>
<head>
<meta charset="utf-8">
<title>MyTutor3</title>
<head>
<body>
<h1>Input your name please!</h1>
<hr />
<form method=POST action="http://localhost/cgi-bin/mytutor.py">
    <table>
    <tr align="left">
    <td>name:</td>
    <td><input type=text name=user/></td>
    </tr>
    <tr align="left">
    <td>age:</td>
    <td><input type=text name=age></td>
    </tr>
    <tr align="left">
    <td>pswd:</td>
    <td><input type=password name=password></td>
    </tr>
    <tr align="canter">
    <td><input type="submit"></td>
    </tr>   
    </table>
</form>
<body>
</html>
  • 通过URL name=value 传参,可传多条(GET模式):

  • 接收来自html的表单,并动态的打印出html格式在浏览器里显示:

#!/usr/bin/python
# 接收来自html的表单,并动态的打印出html格式在浏览器里显示。
"""
runs on the server, reads form input, prints HTML;
url=http://server-name/cgi-bin/tutor3.py
"""

import cgi
form = cgi.FieldStorage()            # parse form data
print('Content-type: text/html')     # plus blank line

html = """
<TITLE>tutor3.py</TITLE>
<H1>Greetings</H1>
<HR>
<P>%s</P>
<HR>"""

if not 'user' in form:
    print(html % 'Who are you?')
else:
    print(html % ('Hello, %s.' % form['user']))

HTML&URL转义
cgi.escape("<>")
"'&lt;&gt;'"

Web状态保存(cookie)
"""
cookie是一个类字典(键值对)对象;
"""

import http.cookies, os             # server端http.cookie模块
cookstr  = os.environ.get("HTTP_COOKIE")   # 查找客户端环境变量的值
cookies  = http.cookies.SimpleCookie(cookstr)    # 用客户端环境变量的值为参数创建cookie对象;
usercook = cookies.get("user")                     # 获取“user”的值;

if usercook == None:                               # 如为空,那就是第一次登陆
    cookies = http.cookies.SimpleCookie()          # 创建cookie对象
    cookies['user']  = 'Brian'                           # 创建cookie对象里的“user”键赋值;
    print(cookies)                                         # 发送cookie信息给客户端(浏览器);
    greeting = '<p>His name shall be... %s</p>' % cookies['user']
else:
    greeting = '<p>Welcome back, %s</p>' % usercook.value     # 如是再次访问就取得信息返回;

print('Content-type: text/html\n')                 # plus blank line now
print(greeting)                                    # 在浏览器打印HTML;

运行本地网络服务器
import os, sys
import http.server
webdir = r"D:\Python\PP4E-Examples-1.2\Examples\PP4E\Internet\Web"
port = 80       # 默认端口:80
os.chdir(webdir)    # 一定要把webdir(要提供服务的文件夹)切换到当前工作目录
serveraddr = ("", port)
serverobj = http.server.HTTPServer(serveraddr, http.server.CGIHTTPRequestHandler) #开启服务
serverobj.serve_forever()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 最近一直在看游双的《高性能linux服务器编程》一书,下载链接: http://download.csdn.net...
    张小方阅读 1,194评论 0 2
  • ​我听见下雨的声音,夹带着心碎声! 亲爱的狐狸精小姐 你好! 貌似,你和我老公聊骚有半年多了吧!要不是昨晚他醉成狗...
    李翊轩言阅读 1,076评论 4 1
  • ReactiveCocoa 中的信号信号在默认情况下都是冷的,每次有新的订阅者订阅信号时都会执行信号创建时传入的 ...
    Draveness阅读 1,707评论 2 13
  • 三千块换来的中道 在婆家呆的一段日子里,身体出现不适,不能用绿色手法去除,只好吃点药了,一吃药,到现在,花了差不多...
    文君45313阅读 192评论 0 0
  • 用电影的方式讲故事。这些照片是用近日刷爆朋友圈的一款软件“足记”做的。 故事讲诉的是一对来自“逗比星球”的逗比在地...
    滕吠吠阅读 283评论 1 2