博客说明:
2020年5月8日18:19:36(过长时间后,仅供参考),以下内容仅为我个人理解,而且有可能存在转化为博客以后会删减东西,还有上传的时候有书写错误的问题,所以只用来为大家提供参考,接下来仅为我自己的理解,详细讲解,可以参考我的理解,不可全当成知识来使用,否则被误人子弟概不负责,还有欢迎各位有问题随时帮我指出,有疑问也可以留言…
环境说明:
Centos6.6 + apache2.2 +python2.6+mod_cgi
文档说明:
以下操作均在root权限下,之后如果有操作权限问题,请自己解决
‘#’ 开头一率为下面命令的具体注释
& 开头为Linux命令
\ 开头为配置文件要插入语句
背景说明:
使用python cgi脚本,在apache2.2上部署一个注册验证,在验证通过时,进行一个访问ip的获取,并插入数据库
先贴下我自己的代码,因为有导入自己编写的数据库类,所以没办法直接运行,这里给自己做个记录,给大家做个参考,这里的代码并不重要
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @Time : 2020/4/13 10:53:42
# @Author : wangjinghui
# @File : register.py
# '''
# 角色注册接口
#
# *请求参数:
# *n 角色名 string (required)
# *i 账号ID int (required)
# *r 大区id int (可选)
# * h 服务器id int (可选)
# * g 登录游戏标示符
#
# * 请求示例:
# * /register.py?n=hello123&i=10002&r=1&h=1001&g=sszsdev
# *
# * 返回:
# * 成功:ok:%s ok:角色ID
# * 失败:fail:%d fail:错误ID(status)
# *
# status说明
# 2 参数错误
# 3 账号不存在
# 4 名字已存在
# 5 账号被禁用
# 6 其他错误
# '''
import cgi, cgitb
from database import SQLManager
from time import time
import os
#获取参数
form = cgi.FieldStorage()
char_name = str.strip(form.getvalue('n', ''))
char_account = int(form.getvalue('i', 0))
char_region = int(form.getvalue('r', 0))
char_server = int(form.getvalue('h', 0))
char_game = str.strip(form.getvalue('g', ''))
def register():
# 参数检测
if all((char_name,char_account)) == False:
status = -2
result = 'fail:%d:Some required parameters are empty' % status
return result
# 开始数据库操作
try:
db = SQLManager()
sql = '''
select * from fiona_logins where login_oid=%d
''' % char_account
req = db.get_all(sql)
if req == []:
status = -3
result = 'fail:%d:Account not existed' % status
return result
#账号禁用
if req[0]['login_is_active'] == False:
status = -5
result = 'fail:%d:Account is blocked'%status
else:
sql = '''
select * from fiona_names where char_name="%s"
'''%char_name
req_name = db.get_all(sql)
if req_name:
status = -4
result = 'fail:%d:Name has been registered'%status
else:
sql = '''
INSERT INTO fiona_names
(char_account,char_name,char_region,char_server,char_create,char_ip)
values(%d,"%s",%d,%d,%d,"%s")
'''%(req[0]['login_oid'],char_name,char_region,char_server,int(time()),os.environ['REMOTE_ADDR'])
db.info_one(sql)
sql = '''
select * from fiona_names where char_name="%s"
'''%char_name
req_name = db.get_one(sql)
result = 'ok:%d'%req_name['char_oid']
db.close()
return result
# 操作数据库失败
except:
db.close()
status = -6
result = 'fail:%d:Other error(Database configuration error)' % status
return result
# 运行
if __name__ == '__main__':
print("Content-type: text/html\n\n")
print(register())
接下来从上面代码片中贴一下和cgi相关的几个点
1.#创建一个cgi实例
form = cgi.FieldStorage()
2.#在脚本被get访问的情况下,获取传参
char_name = str.strip(form.getvalue('n', ''))
char_account = int(form.getvalue('i', 0))
char_region = int(form.getvalue('r', 0))
char_server = int(form.getvalue('h', 0))
char_game = str.strip(form.getvalue('g', ''))
3.#获取访问ip
#由于代码书写不太好,在最后一个sql书写过长,可能部分同学没看到,直接看最后一个变量
#sql = ''' INSERT INTO.....'''
char_ip = os.environ['REMOTE_ADDR']
最后这里列举下cgi相关的几个环境变量,并书写一个查看所有cgi环境变量的小程序
Variable Name | 描述 |
---|---|
CONTENT_TYPE | 内容的数据类型。当客户端发送内容附加到服务器使用。例如,文件上传等。 |
CONTENT_LENGTH | 查询信息的长度。它仅适用于POST请求。 |
HTTP_COOKIE | 返回键和值对的形式设置Cookie。 |
HTTP_USER_AGENT | 用户代理请求头字段包含有关用户代理发起请求信息。网络浏览器的名称。 |
PATH_INFO | TCGI脚本的路径。 |
QUERY_STRING | 被发送GET方法请求URL编码的信息。 |
REMOTE_ADDR | 远程主机发出请求的IP地址。这可以是用于记录或用于认证的目的是有用的。 |
REMOTE_HOST | 发出请求的主机的完全合格的名称。如果该信息不可用,则REMOTE_ADDR可用于获得IP地址。 |
REQUEST_METHOD | 该方法用于制造要求。最常用的方法是GET和POST。 |
SCRIPT_FILENAME | CGI脚本的完整路径。 |
SCRIPT_NAME | CGI脚本的名称。 |
SERVER_NAME | 服务器的主机名或IP地址 |
SERVER_SOFTWARE | 软件服务器运行的名称和版本。 |
import cgi, cgitb,os
if __name__ == '__main__':
print("Content-type: text/html\n\n")
for param in os.environ.keys():
print "<b>%20s</b>: %s<r>" % (param, os.environ[param])
致言
写的很啰嗦,不喜欢的只看主要代码片就行,有问题可以联系我或者留言。
进来的谢谢捧场,喜欢的麻烦点个赞,您的点赞是对我最大的支持。