flask+redis構建查詢頁面

來源:互聯網
上載者:User

標籤:localhost   storage   password   mysql   import   

  之前寫過一篇關於12306資訊查詢頁面的文章,今天重新整理一下,我用的是flask+redis,由於資料十幾萬都放在mysql裡,即使建立索引,我的vps還是有點吃緊。

   redis可以做storage和cache,由於這些資料不是很重要,丟了大不了再匯入一次,但是我們更在乎的是查詢效率,所以redis做storage是很好的選擇。

   首先把檔案裡的資料匯入redis,raw檔案裡的資料是以下格式的,檔案名稱為result.txt

  650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/DE/wKiom1T-lCWyHd9tAALJTU3Ifdo032.jpg" title="idtxt.png" alt="wKiom1T-lCWyHd9tAALJTU3Ifdo032.jpg" />匯入redis的代碼如下:

# -*- coding: utf-8 -*-import redisimport timestart = time.clock()redisClient = redis.StrictRedis(host=‘localhost‘,port=6379,db=0,password=‘[email protected]‘)f = open(‘result.txt‘,‘r‘)while True:    line = f.readline()    if not line:        break    lines = line.replace("\n","").replace("\r\n","").split("----")    redisClient.hset(lines[0],"id",lines[0])    redisClient.hset(lines[0],"name",lines[1])    redisClient.hset(lines[0],"password",lines[2])    redisClient.hset(lines[0],"email",lines[3])    redisClient.hset(lines[0],"phone",lines[4])f.close()end = time.clock()print "used:", end -start

13w資料不到一分半鐘。。。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/D9/wKioL1T-ldLz6pslAAA2ygAPZBU249.jpg" title="time.png" alt="wKioL1T-ldLz6pslAAA2ygAPZBU249.jpg" />

這裡我的key都是id也就是***好,其它都是hash的資料結構形式儲存的。redis的優點之一就是可以支援豐富的資料結構。登入redis,執行keys *看一下

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5A/D9/wKioL1T-maejadpaAAI6Mo5TBYQ192.jpg" title="idext.png" alt="wKioL1T-maejadpaAAI6Mo5TBYQ192.jpg" />

ok,資料有了,那麼開始上flask了,代碼如下:

# -*- coding: utf-8 -*-from flask import Flask, request, render_template, jsonify, jsonimport  redisapp = Flask(__name__)@app.route(‘/api/<id>‘, methods=[‘GET‘])def scan(id):     redis_client = redis.StrictRedis(host=‘127.0.0.1‘,port=6379,db=0,password=‘[email protected]‘)     get_key = redis_client.keys(id)     if not get_key :            json_result = {‘id‘ : None}            return json.dumps(json_result,ensure_ascii=False)     else:            get_key = redis_client.hmget(id,‘name‘,‘password‘,‘email‘,‘phone‘)            json_result = {‘id‘   : str(id),                           ‘name‘ : get_key[0],                           ‘pass‘ : get_key[1],                           ‘email‘: get_key[2],                           ‘phone‘: get_key[3]                          }            return json.dumps(json_result,ensure_ascii=False)@app.route(‘/‘)def index():    return render_template(‘index.html‘)if __name__ == ‘__main__‘:  app.run(host=‘0.0.0.0‘, port = 8080, debug=True)

我們要查詢哪個使用者就把傳參數給flask封裝的api,這就是給介面傳參即可。

什麼是介面?看下面的說明理解一下。

在瀏覽器裡輸入api地址,隨便傳一個不存在的參數,也就是***號。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/DE/wKiom1T-mguCQjmgAABMA5WP51M516.jpg" title="api.png" alt="wKiom1T-mguCQjmgAABMA5WP51M516.jpg" />

介面傳回值為null

如果傳參是存在的,就會有正確的傳回值。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/D9/wKioL1T-m62TPgd0AACHmQSPC0o936.jpg" title="id2.png" alt="wKioL1T-m62TPgd0AACHmQSPC0o936.jpg" />

最後就是前端頁面展示了,我用的是bootstrap和jquery的ajax外掛程式。代碼如下:

<!DOCTYPE html><html lang="en">  <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1">    <meta name="description" content="">    <meta name="author" content="">    <link rel="icon" href="{{ url_for(‘static‘, filename=‘icon/favicon.ico‘) }}">    <title>12306</title>    <!-- Bootstrap core CSS -->    <link href="{{ url_for(‘static‘, filename=‘css/bootstrap.min.css‘) }}" rel="stylesheet">    <!-- Custom styles for this template -->    <link href="{{ url_for(‘static‘, filename=‘css/jumbotron.css‘) }}" rel="stylesheet">    <!-- Just for debugging purposes. Don‘t actually copy these 2 lines! -->    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->    <!--[if lt IE 9]>      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>    <![endif]-->  </head>  <body>    <!-- Main jumbotron for a primary marketing message or call to action --><nav class="navbar navbar-inverse navbar-fixed-top">      <div class="container">        <div class="navbar-header">                  <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">            <span class="sr-only">12306</span>            <span class="icon-bar"></span>            <span class="icon-bar"></span>            <span class="icon-bar"></span>          </button>          <a class="navbar-brand" href="#">12306網站使用者資訊洩漏查詢</a>        </div></nav>        <script src="{{ url_for(‘static‘, filename=‘js/template.js‘) }}"></script><div class="container" style="padding-top: 48px;">    <div class="bs-callout bs-callout-info mt0">        <div class="alert alert-danger">            <p><h4>本系統程式僅為使用者確認個人資訊是否已經泄露,切勿用作非法目的,否則一切後果自負!</h4></p>        </div>    </div><div class="row" style="margin:0;min-height:600px">            <div class="jumbotron search-box">                <p>請輸入關鍵字:</p>                <div class="input-group">                    <input placeholder="***號"                           type="text" name="id" id="keyword" class="form-control">                    <span class="input-group-btn scan-but-span">                        <button class="btn btn-success" onclick="scan()" type="button">尋找一下</button>                    </span>                </div>                <div class="input-group mt15">                <script type="text/javascript" src="                  </div>                <div id="scan-result-box">                </div>              </div>            <div id="container" class="row" style="hight:280px">        </div>    </div>        <!-- Bootstrap core JavaScript    ================================================== -->    <!-- Placed at the end of the document so the pages load faster -->    <script src="{{ url_for(‘static‘, filename=‘js/jquery.min.js‘) }}"></script>    <script src="{{ url_for(‘static‘, filename=‘js/bootstrap.min.js‘) }}"></script><script>var geetest_passed = false;    var selectorObj;    function gt_custom_ajax(result, selector) {        selectorObj=selector;        geetest_passed = result;    }    var keyword = "";            function scan(){             keyword = $.trim($("#keyword").val());                 if(keyword==‘‘){                    alert(‘請輸入***‘);                    $("#keyword").focus()                    return false;                 }                if(!geetest_passed) {                                     alert("請滑動圖片進行驗證!")                                        return false;                    }            $.ajax({                        type:‘get‘,                        dataType:‘json‘,                        url:‘  //本地的ip或網域名稱                         success:function(data){                        if(!data.id){                                alert(‘恭喜!您的資訊沒有被泄露!‘);                                return false;                            }                var re="<ul>";                    re+="<li>姓  名:"+data.name+‘</li>‘;                    re+="<li>***:"+data.id+‘</li>‘;                    re+="<li>E-mail:"+data.email+‘</li>‘;                    re+="<li>手機號:"+data.phone+‘</li>‘;                    re+="</ul>"                    $(‘#container‘).html(re)                        },                        error:function(){                            alert(‘您的資訊不存在!‘)                        }                    })                }     </script>  </body> </html

好了,啟動webserver,看看頁面查詢情況:

輸入一個***號,如果存在,頁面就會返回

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5A/DA/wKioL1T-ne-zfR2TAAE9s85kjds349.jpg" title="id321.png" alt="wKioL1T-ne-zfR2TAAE9s85kjds349.jpg" />

如果不存在,js就會alert一個彈框。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/DA/wKioL1T-nqzw3v8JAAFOWfEgv_4047.jpg" title="id312.png" alt="wKioL1T-nqzw3v8JAAFOWfEgv_4047.jpg" />

是不是還比較簡單,我的好友強子想瞭解一下如何構建,所以分享一下。。。

本文出自 “老徐的私房菜” 部落格,謝絕轉載!

flask+redis構建查詢頁面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.