Flask实现身份证号查询相关信息(Python2.7)

Python3是趋势,但是新浪SAE平台的便宜点的微服务,是Python2.7的。所以以下代码的环境是Python2.7.

原理是,一些关于政策的表,以这种Excel的方式存储在文件夹中:

创建一个类,并将主要的信息进行清洗后存入相关列表。将这个列表传入服务器,并将其渲染在模板中。

  • 数据类的建立。虽然传入的是身份证号,但实际上是以户为单位展示信息,所以每一户唯一的标识就是户的编号。将户编号的相应列表的每一行都渲染在网页中。
#/usr/bin/env python
# -*- coding: UTF-8 -*-
import pandas as pd
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
import numpy as np

infoBasicPath = u'?????.xls'             #数据的来源表
moneyMessagePath = u'???'                 #政策的来源是这个文件夹
name = u'身份证号'                                 #查询是判断身份证号(姓名有重复,其他信息不利于准确查询,此处
checkID = u'户编号'                        #是以户编号为基础进行查询的
#获得顶部显示信息
class message():                        #message类获得全部要查询的信息
        huNumber = ''                   #户编号变量
        messageTop = ''                 #用于展示在网页顶端的字符串
        messTableList = []              #详细信息的dataframe,以列表形式存储在这个列表里
        #fileNamePrint = ''
        def basicMessage(self,idNum):           #获得基本信息,也就是户主姓名,脱贫年度等信息
                messageTable = pd.DataFrame(pd.read_excel(infoBasicPath))       #读取excel信息,并转化为dataframe
                messageTable[name] = messageTable[name].apply(lambda x: str(x)[:18].upper())     #将身份证号全部变为大写
                idNum = str(idNum)                                              #字符串化,否则可能出现自动识别为数字的情况
                if idNum!='':
                        idNum = str(idNum)[:18].upper()                 #将用户输入的身份证号的x变为大写
                        try:
                                mask = messageTable[name].isin([idNum]) #如果身份证号在这个dataframe里,那么将读取这行的姓名 和 脱贫年度等信息,并组合为字符串
                                littleData = messageTable[mask]
                                littleData = littleData.reset_index()                         #抛弃原来的索引,重新建立索引
                                huzhuName = str(littleData[u'姓名'][0])
                                outYear = str(littleData[u'脱贫年度'][0])
                                self.messageTop = u'姓名:'+huzhuName+u'           脱贫年度:'+ outYear
                                self.huNumber = str(littleData[u'户编号'][0])
                        except:
                                self.messageTop = u'无信息'
                return self.messageTop
        def moneyTable(self):           #输入身份证号,获得户编号之后,执行此函数,得到享受所有的政策
                if self.huNumber != '':
                        for filename in os.listdir(moneyMessagePath):  # 读取文件名称,读取所有享受政策的文件
                                if filename[-3:] == 'xls':
                                        targetPath = moneyMessagePath + '/' + filename  # 构造文件夹内每一个文件的绝对路径
                                        detailTableAll = pd.DataFrame(pd.read_excel(targetPath,dtype='str'))    #以文本形式读取,避免出现电话号码后面出现.0
                                        mask = detailTableAll[checkID].isin([self.huNumber])            #获取户编号所在的索引
                                        littleData = detailTableAll[mask]                       #以索引方式获得户主户编号的所有dataframe
                                        littleData = littleData[littleData.columns.drop(list(littleData.filter(regex=checkID)))]        #删除户编号所在的列(checkID就是户编号)
                                        if littleData.empty!=True:                              #如果得到的dataframe不为空,则清洗数据,并添加到列表中
                                                littleData = littleData.replace('0', np.nan)    #将数值0 统一变更为空值 np.nan是空值
                                                jisuanData = littleData.drop([u'人数',u'与户主关系'], 1)
                                                shengyuData = jisuanData.dropna(axis=1,how='all')               #删除全部为Nan的列
                                                nanData = shengyuData.drop(['Name'], 1)                        #删除name列,获得纯值的表
                                                haveData = nanData.dropna(axis=0,how='all')                     #删除空值行,获得有值的表
                                                realDataList = haveData.index.tolist()                          #获得有值的表格的索引列表
                                                realData = shengyuData.loc[realDataList, :]                      #获得纯数据的dataframe
                                                realDataShow = realData.replace(np.nan,'')                      #将空值统一改为 空
                                                if realDataShow.empty == False:
                                                        self.messTableList.append(realDataShow)

                return self.messTableList
  • 这个数据传入flask服务器。
#/usr/bin/env python
# -*- coding: UTF-8 -*-
from flask import Flask,redirect
from flask import render_template
from flask import request,url_for
import newsMessage

import sys


reload(sys)
sys.setdefaultencoding('utf-8')
#以上代码保证flask正常显示中文
app = Flask(__name__)


@app.route('/',methods=['POST','GET'])          #以post 和 get方式获取数据
def index():
    if request.method == 'POST':                    #用post方法获取html中的数据,也就是传入数据
        searchID = request.form.get('searchInput')  #获得文本框传入的数据
        if len(str(searchID))>17:                   #若输入的身份证号大于
            contClass = newsMessage.message()  #实例化类
            oneMess = contClass.basicMessage(searchID)  #获得信息字符串
            del contClass.moneyTable()[-len(contClass.moneyTable()):]   #清空列表所有元素,不染
            oneList = contClass.moneyTable()        #将实例中列表元素清除之后,再获取新的内容
            return render_template('index.html',content = oneMess,dataList = oneList)   #向模板中传入数据
        else:
            return redirect(url_for('index'))           #如果身份证号输入有误,则重新定位到index
    return render_template('index.html', content='',dataList = '')      #渲染模板 空值
if __name__ == '__main__':
    app.run()

flask模板的渲染。

<nav id="navbar" class="navbar-collapse collapse">
                            <ul class="nav navbar-nav">

                                <li>
                                    <a>{{ content }}</a>
                                </li>

                            </ul>
                            <!-- mega-menu End -->
                        </nav>



<div class="col-md-7 col-sm-7 col-xs-12">
                    <div class="romana_domain_search">
                        <form  action="{{ url_for('index') }}" method="POST">
                            <div class="romana_search_input">
                                <input type="text" name='searchInput' id="searchInput" placeholder="请输入姓名">
                            </div>
                            <div class="romana_search_submit">
                                <input  type="submit" value="搜索">
                            </div>
                        </form>

                    </div>
                </div>





<div class="table_contant">
        <p>这里写基本内容 132627196301132826</p>

        <div>

            {% for k in dataList %}
                <table border="1">
                <tr>
                {% for lieName in k.columns.values.tolist() %}
                    <th>{{ lieName }}</th>
                {% endfor %}
                </tr>

                {% for dataJutiList in k.values.tolist() %}
                    <tr>
                    {% for cX in dataJutiList %}

                        <td>{{ cX }}</td>

                        {% endfor %}
                    </tr>
                {% endfor %}

                </table>
                <p>---------</p>
            {% endfor %}


        </div>
    </div>

 

最终效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limaning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值