<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        flask完成一個小應用方法

        來源:懂視網 責編:小采 時間:2020-11-27 14:13:54
        文檔

        flask完成一個小應用方法

        flask完成一個小應用方法:上周 @萍姐 問我如何抓取天貓上面店鋪的評分,看了下挺簡單的,于是花了點時間寫了個Python腳本,加上web.py做成一個web服務,使用起來還不錯,今天來看的時候發現當時為了方便直接用web.py開發有點簡陋,自己也好久沒用flask寫過東西了,打算用flask再
        推薦度:
        導讀flask完成一個小應用方法:上周 @萍姐 問我如何抓取天貓上面店鋪的評分,看了下挺簡單的,于是花了點時間寫了個Python腳本,加上web.py做成一個web服務,使用起來還不錯,今天來看的時候發現當時為了方便直接用web.py開發有點簡陋,自己也好久沒用flask寫過東西了,打算用flask再
        上周 @萍姐 問我如何抓取天貓上面店鋪的評分,看了下挺簡單的,于是花了點時間寫了個Python腳本,加上web.py做成一個web服務,使用起來還不錯,今天來看的時候發現當時為了方便直接用web.py開發有點簡陋,自己也好久沒用flask寫過東西了,打算用flask再寫一遍,順便復習下舊的知識,如果你是flask初學者,可以參考這個例子。

        提示:博主默認你已經具備了Python的基礎知識,已經能夠很順暢的編寫一些Python腳本,否則接下來你會比較難看懂。

        舊版

        這里先給出舊版本的一些使用截圖,初始化的時候的樣子

        火狐截圖_2016-10-30t01-27-00.009z.png - 大小: 14.18 KB - 尺寸: 529 x 199 - 點擊打開新窗口瀏覽全圖

        模糊查詢

        火狐截圖_2016-10-30t01-28-39.825z.png - 大小: 49.02 KB - 尺寸: 420 x 648 - 點擊打開新窗口瀏覽全圖

        精確查詢

        火狐截圖_2016-10-30t01-29-34.543z.png - 大小: 16.66 KB - 尺寸: 517 x 195 - 點擊打開新窗口瀏覽全圖

        技術

        這個應用比較簡單,所使用的技術也比較少,主要有以下技術要點

      1. requests模擬請求

      2. 正則匹配關鍵字

      3. web.py搭建web環境

      4. vue.js做數據自動綁定

      5. 是不是很簡單?

        Flask Web開發基于Python的Web應用開發實戰pdf

        在這個小應用中使用web.py的時候目錄結構是這樣的

        2016-10-30 09-55-46屏幕截圖.png - 大小: 16.82 KB - 尺寸: 766 x 107 - 點擊打開新窗口瀏覽全圖

        其中static目錄里面存放的是靜態資源

        2016-10-30 09-57-18屏幕截圖.png - 大小: 26.57 KB - 尺寸: 694 x 166 - 點擊打開新窗口瀏覽全圖

        結構相當簡單

        python代碼

        這里給出全部的Python代碼

        #!/usr/bin/env python# coding=utf-8import requestsimport jsonimport webimport sysimport re
        
        reload(sys)
        sys.setdefaultencoding('utf8')
        
        urls = ("/", "index","/query", "Query")
        
        
        render = web.template.render('static', cache=False)class index:def GET(self):return render.index('static')class Query:def POST(self):
         keywords = str(web.input().get('shopname'))
         url_base = ""+keywords
         headers = {"User-Agent": "iphone7"}try:
         result_base = requests.get(url=url_base, headers=headers, timeout=15).content.replace('
        ', '').replace(' ','')
         infostr = re.findall(r'j_shop_moreshop_more">(.+?)</div>', result_base)
         shoplist = []for item in infostr:
         scorelist = re.findall(r'">(.+?)</span><iclass="', item)
         thisShopname = re.findall(r'<span>(.+?)</span>', item)[0]
         shoplist.append('{"shopname": "'+ thisShopname +'" , "dsr": "'+scorelist[0]+'", "service": "'+scorelist[1].split('">')[1]+'","ship": "'+scorelist[2].split('">')[1]+'"}')return json.dumps({"code": 0, "rows":list(set(shoplist))})except Exception, e:print ereturn json.dumps({"code": -1, "msg": "沒查詢到相關店鋪"})if __name__ == "__main__":
         app = web.application(urls, globals())
         app.run()

        前端HTML代碼

        $def with (urlbase)<!DOCTYPE html>
        <html lang="zh-CN">
         <head>
         <meta charset="utf-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge">
         <meta name="renderer" content="webkit">
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <title>Hello world</title>
         </head>
         <body>
         <input type="text" name="shopname">
         <input type="button" value="提交" @click="query">
         <div class="info" v-for="item in shopes" style="border-bottom: #ccc 1px dashed">
         <p>店鋪:{{ item.shopname }}</p>
         <p>描述相符:{{ item.dsr }}<br>服務態度:{{ item.service }}<br>物流服務:{{ item.ship }}</p>
         </div>
         <script type="text/javascript" src="$urlbase/jquery.min.js"></script>
         <script type="text/javascript" src="$urlbase/vue.js"></script>
         <script type="text/javascript" src="$urlbase/index.js"></script>
         </body>
        </html>

        js代碼

        var mainVM = new Vue({
         el: 'body',
         data: {
         shopes:[
         {
         shopname:'未查詢',
         dsr:'未查詢',
         service:'未查詢',
         ship:'未查詢'}
         ]
         },
         methods:{
         query:function(){
         var _self = this,keyword = $('input[name="shopname"]').val();
         $.post('/query',{"shopname":keyword},function (data) {if(data.code == 0){
         _self.shopes = [];for(var k in data.rows){
         var thisdata = JSON.parse(data.rows[k]);
         _self.shopes.push({
         shopname:thisdata.shopname,
         dsr:thisdata.dsr,
         service:thisdata.service,
         ship:thisdata.ship
         })
         }
         }else{
         alert('查詢出錯,錯誤信息:'+data.msg);
         }
         },"json");
         }
         }
        });

          可以說代碼部分也是相當簡單,前端HTML和js的代碼就不解釋了,很容易看懂,這里只對app.py做簡單的解釋。

          觀察天貓的搜索頁面,發現天貓pc端跟手機端頁面都可以輕松抓取,但是使用手機端頁面會更加快速方便,因為結構上更加清晰,而且數據量少,抓取速度更快

          如何實現只抓取手機端頁面的數據呢?很簡單,這里我們只需要定義以下HTTP的請求頭信息就可以了,也就是headers,如下定義

          headers={"User-Agent":"iphone7"}

          天貓的搜索鏈接是使用的get請求,地址為

          "https://list.tmall.com/search_product.htm?q="+keywords

          參數只需要傳入一個關鍵字就可以了,前端使用ajax把數據POST給服務端,服務端接收使用下面的這句話

          keywords=str(web.input().get('shopname'))

          是不是馬上就搞定了關鍵的幾步了?接下來發起請求拿到數據就可以了

          result_base=requests.get(url=url_base,headers=headers,timeout=15).content.replace(' ','').replace('','')

          注意,這里我把返回的結果中的換行跟空格都去掉了,因為我這里所需要的數據很簡單,為了匹配方便我直接給替換成可空,也就是后面的這個

          .replace(' ','').replace('','')

          然后根據正則匹配的字符串進行遍歷組合成結果返回給前端就好了,前端直接使用vue.js進行數據的綁定,幾乎不需要DOM操作就可以完成結果列表的渲染,棒!(這里強行安利一波vue.js)

          前后端通信使用json進行數據交互,友好而且方便。

        重寫

        上面給出了所需要的技術要點和關鍵代碼,那么現在我需要使用flask重寫一遍,當然了,關鍵部分還是不用變動,只是處理方式上稍微有些差異,如果會用web.py,那么使用flask上手應該是很快的。

        1、web.py的處理方式

        在使用web.py的時候我們啟動一個web服務很簡單,通常執行以下命令

        python app.py

        這樣我們就啟動了一個web服務,但是這樣的話會有很多問題,主要有以下幾點

      6. 不能關閉終端窗口,否則應用結束,一般用于調試

      7. 多個應用的時候公用Python環境會引起沖突

      8. 注意:

        web.py并不適合高并發的應用,但是作為一般應用還是可以輕松應對的。

        以上命令執行后web.py會在8080端口綁定一個web服務,如果你想創建多個應用,那么你應該在后面加上端口號

        如果你使用了多個域名指向一臺機器的多個應用,那么你應該使用nginx來轉發請求,而不是直接輸入域名加端口號

        在遠程vps上運行開發完成的應用時,你可以執行以下命令把web以后臺服務的形式運行

        nohup python app.py

        這種方式簡單粗暴,但是僅僅作為臨時方案是可行的,運行上述命令后你可以安心的關掉終端,而且web服務依然在運行,但是一旦重啟了服務器,那么就得重新登錄vps再次執行命令,不是很方便。

        2、flask的處理方式

        flask和web.py類似,它自帶了一個web服務器,默認綁定在5000端口,但是它本身自帶的web服務器并不是很好,安全性也不高,作為開發使用還是足夠的,正式生產環境中不太建議直接使用flask自帶的web服務。

        好了,現在可以開始了,為了解決上面提到幾個問題,這里咱們來使用一個新東西,上面說了多應用環境沖突的問題,在這兒可以使用一個叫做“虛擬環境”的東西解決。

        “虛擬環境”就是直接復制一個Python的全局環境,但是是獨立出來的,你可以在這個環境里面安裝各種模塊,而且不會影響到Python的全局環境,也就是說如果你把其中的一個“虛擬環境”給玩壞了,起不來了,那么你只需要刪掉壞的“虛擬環境”重新創建一個就可以了,這些操作都不會對Python全局環境有任何的影響,安全又方便,下面咱們就來創建一個“虛擬環境”。

        博主使用的開發環境是Ubuntu 16.04 并沒有自帶這個軟件,使用下面的命令安裝

        sudo apt-get install python-virtualenv -y

        安裝完之后測試下是否安裝成功

        ~$ virtualenv --version
        15.0.1

        接下來咱們創建一個叫 tmall 虛擬環境用于運行我們的應用

        ~$ virtualenv tmall
        Running virtualenv with interpreter /usr/bin/python2
        New python executable in /home/kbdancer/tmall/bin/python2
        Also creating executable in /home/kbdancer/tmall/bin/python
        Installing setuptools, pkg_resources, pip, wheel...done.

        創建的時候會給出創建的位置,如果你需要在指定的目錄下面創建虛擬環境,那么你得切換到目標目錄,然后執行創建命令,博主這里直接在自己的用戶目錄下面執行的創建命令,自然就是在用戶目錄下面生成的一個 tmall 文件夾,文件夾下面自動生成了Python環境

        2016-10-30 10-39-57屏幕截圖.png - 大小: 36.01 KB - 尺寸: 768 x 243 - 點擊打開新窗口瀏覽全圖

        安裝完之后需要將這個環境激活才能使用,執行下面的命令進行激活

        ~$ source tmall/bin/activate
        (tmall) :~$

        接著在虛擬環境中安裝flask環境(博主默認你的Python全局環境中已經有了easy_install或者pip),博主這里使用pip進行安裝

        ~$ pip install flask

        好了,所需要的環境配置完成,接下來就可以開始寫小應用了。

        3、開始編碼

        編碼這個環節應該是快速而且高效的,上面我們已經給出了舊代碼,關鍵部分直接復制過來就能用,稍微改改就可以跑起來了。

        flask默認使用Jinja2作為模板引擎,Jinja2在進行模板渲染的時候通常會識別{{}}中的內容進行填充,但是這里博主遇到了一個尷尬的問題,Vue.js也是使用的{{}}作為標識符進行渲染,這就導致了沖突,訪問頁面的時候就會出現如圖所示的錯誤

        火狐截圖_2016-10-30t03-27-29.227z.png - 大小: 123.67 KB - 尺寸: x - 點擊打開新窗口瀏覽全圖

        當然,解決方法還是有的,參考這篇文章進行配置 解決Jinja2與Vue.js的模板沖突 解決思路也比較簡單,就是在需要Jinja2渲染的時候添加一個空格,而vue.js渲染的時候則不需要空格,python腳本如下

        from flask import Flask, render_template
        
        app = Flask(__name__)
        app.jinja_env.variable_start_string = '{{ '
        app.jinja_env.variable_end_string = ' }}'

        前端HTML代碼修改后就成了這樣

        <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="renderer" content="webkit"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Hello world</title></head><body><input type="text" name="shopname"><input type="button" value="提交" @click="query"><div class="info" v-for="item in shopes" style="border-bottom: #ccc 1px dashed"><p>店鋪:{{item.shopname}}</p><p>描述相符:{{item.dsr}}<br>服務態度:{{item.service}}<br>物流服務:{{item.ship}}</p></div><script type="text/javascript" src="{{ url_for('static', filename='jquery.min.js') }}"></script><script type="text/javascript" src="{{ url_for('static', filename='vue.js') }}"></script><script type="text/javascript" src="{{ url_for('static', filename='index.js') }}"></script></body></html>

        Jinja2默認會在templates目錄下面尋找模板文件,而靜態文件比如css,js之類的默認存儲在static目錄下面,這里我們按照Jinja2的默認設置稍微進行修改,當然,如果你想自定義模板目錄或者靜態文件的目錄也是可以的,只需要稍微的配置下就行了,博主這里按照默認的規則來設置。

        很快,我們的小應用就跑起來了

        2016-10-30 11-34-42屏幕截圖.png - 大小: 19.03 KB - 尺寸: 565 x 309 - 點擊打開新窗口瀏覽全圖

        這里還是需要提到幾個關鍵點:

        flask中接收前端傳遞過來的參數用到的是request對象,前端使用json把數據post到后端,后端使用下面這句進行接收

        request.form.get('shopname')

        更多詳細使用方法參考這個地址 淺入淺出Flask框架:處理客戶端通過POST方法傳送的數據 接著測試下小應用能不能正常運行

        2016-10-30 11-56-46屏幕截圖.png - 大小: 54.49 KB - 尺寸: 587 x 686 - 點擊打開新窗口瀏覽全圖2016-10-30 11-58-39屏幕截圖.png - 大小: 44.3 KB - 尺寸: 579 x 565 - 點擊打開新窗口瀏覽全圖

        OK,測試通過。

        4、關于部署

        由于這個小應用比較簡單,部署起來可以按照常規的部署方式進行,但是并不適合生產環境,所以這里暫時不寫如何部署,下次有大型網站案例的時候再詳細寫如何部署以及優化。

        5、完整代碼

        python部分

        #!/usr/bin/env python# coding=utf-8from flask import Flask, render_template, requestimport requestsimport jsonimport re
        
        app = Flask(__name__)
        app.jinja_env.variable_start_string = '{{ '
        app.jinja_env.variable_end_string = ' }}'@app.route('/')def index():return render_template('index.html')@app.route('/query', methods=['POST'])def query():
         keywords = request.form.get('shopname')
         url_base = "https://list.tmall.com/search_product.htm?q=" + keywords
         headers = {"User-Agent": "iphone7"}try:
         result_base = requests.get(url=url_base, headers=headers, timeout=15).content.replace('
        ', '').replace(' ', '')
         infostr = re.findall(r'j_shop_moreshop_more">(.+?)</div>', result_base)
         shoplist = []for item in infostr:
         scorelist = re.findall(r'">(.+?)</span><iclass="', item)
         thisShopname = re.findall(r'<span>(.+?)</span>', item)[0]
         shoplist.append('{"shopname": "' + thisShopname + '" , "dsr": "' + scorelist[0] + '", "service": "' + scorelist[1].split('">')[1] + '","ship": "' + scorelist[2].split('">')[1] + '"}')return json.dumps({"code": 0, "rows": list(set(shoplist))})except Exception, e:print ereturn json.dumps({"code": -1, "msg": "沒查詢到相關店鋪"})if __name__ == "__main__":
         app.run(debug=True)

        HTML部分

        <!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="renderer" content="webkit"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Hello world</title></head><body><input type="text" name="shopname"><input type="button" value="提交" @click="query"><div class="info" v-for="item in shopes" style="border-bottom: #ccc 1px dashed"><p>店鋪:{{item.shopname}}</p><p>描述相符:{{item.dsr}}<br>服務態度:{{item.service}}<br>物流服務:{{item.ship}}</p></div><script type="text/javascript" src="{{ url_for('static', filename='jquery.min.js') }}"></script><script type="text/javascript" src="{{ url_for('static', filename='vue.js') }}"></script><script type="text/javascript" src="{{ url_for('static', filename='index.js') }}"></script></body></html>

        JS部分

        沒有做任何改動,就不貼出來了

        總結

        寫這篇文章的目的一來是復習下flask的一些知識,二來是與web.py做個對比,再者就是給入門的朋友提供一個實戰的例子,方便參考。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        flask完成一個小應用方法

        flask完成一個小應用方法:上周 @萍姐 問我如何抓取天貓上面店鋪的評分,看了下挺簡單的,于是花了點時間寫了個Python腳本,加上web.py做成一個web服務,使用起來還不錯,今天來看的時候發現當時為了方便直接用web.py開發有點簡陋,自己也好久沒用flask寫過東西了,打算用flask再
        推薦度:
        標簽: 一個 方法 應用
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产成人爱av在线播放| 成人女人A级毛片免费软件| 巨胸喷奶水视频www网免费| 99ri精品国产亚洲| 久久中文字幕免费视频| 亚洲精品无码久久久久| 成年女人A毛片免费视频| 亚洲日产韩国一二三四区| 久久www免费人成看国产片| 亚洲精品无码永久中文字幕| 久久国产精品国产自线拍免费| 黑人精品videos亚洲人| 国产成人无码区免费网站| 亚洲AV区无码字幕中文色| 67pao强力打造高清免费| 亚洲人成777在线播放| 女人张开腿等男人桶免费视频| 亚洲日本VA午夜在线电影| 国产一区在线观看免费| 牛牛在线精品观看免费正| 久久精品夜色噜噜亚洲A∨| 精品四虎免费观看国产高清午夜| 亚洲一卡2卡三卡4卡有限公司| 免费观看美女用震蛋喷水的视频 | 香蕉视频在线观看免费| 啊v在线免费观看| 久久毛片免费看一区二区三区| 亚洲AV第一页国产精品| 一级女人18毛片免费| 国产精品亚洲色婷婷99久久精品| 亚洲精品国产综合久久一线| 三年片在线观看免费西瓜视频| 亚洲精品在线电影| 国产禁女女网站免费看| 在线观看片免费人成视频播放| 中文字幕亚洲综合久久2| 麻豆精品国产免费观看| 免费精品久久天干天干| 日韩亚洲国产综合高清| 亚洲精品狼友在线播放| 99久久免费精品国产72精品九九|