apache python cgi获取参数和访问ip

博客说明:
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_INFOTCGI脚本的路径。
QUERY_STRING被发送GET方法请求URL编码的信息。
REMOTE_ADDR远程主机发出请求的IP地址。这可以是用于记录或用于认证的目的是有用的。
REMOTE_HOST发出请求的主机的完全合格的名称。如果该信息不可用,则REMOTE_ADDR可用于获得IP地址。
REQUEST_METHOD该方法用于制造要求。最常用的方法是GET和POST。
SCRIPT_FILENAMECGI脚本的完整路径。
SCRIPT_NAMECGI脚本的名称。
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])

最后这里引用下我自己写的cgi相关配置文档

致言

写的很啰嗦,不喜欢的只看主要代码片就行,有问题可以联系我或者留言。
进来的谢谢捧场,喜欢的麻烦点个赞,您的点赞是对我最大的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值