網站框架功能:python
新建文件夾,建立虛擬環境(建立虛擬環境的好處就不說了),安裝須要的包。mysql
1)安裝pipenv包,pip install pipenvgit
2) 在項目文件下用pipenv建立虛擬環境,pipenv installweb
3)按照提示pipenv shell進入虛擬環境sql
進入虛擬環境後發現只有虛擬環境提供的包:shell
4)安裝一些須要的包,首先flask,這時候安裝不是pip,是pipenv install flask數據庫
關於虛擬環境pipenv編程
進入:pipenv shelljson
退出:exitflask
安裝與卸載包:pipenv install 包名,pipenv uninstall 包名
查看包的安裝關係: pipenv graph 詳細看gitHub官方文檔。
5)開發工具
pycharm,數據庫mysql(直接安裝Xampp),Navicat(數據庫可視化管理工具),安裝過程略
1)創建文件config.py做爲配置文件,在主文件夾中確定要導入配置文件,通常是from。flask有一個高尚的方法
通常支持三種搜索方式:書名(精準與模糊),做者,ISBN
也可說兩種:關鍵字檢索,ISBN號檢索
1)搜索的數據哪裏來?
數據庫?固然不是,沒有這麼多。這裏依靠外部的API完成
圖書數據的基地址:http://t.yushu.im
關鍵字搜索:http://t.yushu.im/v2/book/search?q={}&start={}&count={} 解釋三個參數:q傳遞關鍵字,由於返回不少記錄,start與count控制分頁
ISBN搜索:http://t.yushu.im/v2/book/isbn/{isbn}
也能夠用豆瓣API:http://api.douban.com/v2/book (此博客用的是上面api,豆瓣的API有訪問頻率控制)
爲了方便編程,理解一下isbn,他有兩種形式,isbn13(13個數字組成);isbn10(10個數字組成,不過中間可能含有‘ - ’)
爲了方便閱讀等好處:創建文件夾helper,放一些被調用的函數。
#!/usr/bin/env python #-*-coding:utf-8 -*- ''' 編寫一些函數,用於調用 ''' def is_isbn_or_key(word): """ 判讀輸入的參數是關鍵仍是isbn,isbn有兩種,isbn10,isbn13 :param word: q :return: 'key' 或者 ‘isbn’ """ isbn_or_key = 'key' if len(word) == 13 and word.isdigit(): isbn_or_key = 'isbn' short_word= word.replace('-', '') if '-' in word and len(short_word)==10 and short_word.isdigit(): isbn_or_key = 'isbn' return isbn_or_key
這樣視圖函數就比較乾淨:(固然還沒寫完)
如何在python代碼中調用上面的外部API(按照restful標準來的)?
先觀察API返回的數據類型,找一個isbn編號爲9787501524044,訪問http://t.yushu.im/v2/book/isbn/9787501524044,發現是json格式。
可是當咱們輸入錯誤數據時(isbn錯誤),返回{"msg": "book not found", "code": 2000}。因此這種異常也要考慮。HTTP 200表示成功
寫一個http請求函數(放在http.py中)
# 兩種http請求,urllib(from urllib import request)與requests import requests class HTTP: @staticmethod def get(url, return_json=True): r = requests.get(url) # 由於咱們調用的API是get型,json型 if r.status_code != 200: return {} if return_json else '' return r.json() if return_json else r.text # 與上面等價 # if r.status_code == 200: # if return_json: # return r.json() # else: # return r.text() # else: # if return_json: # return {} # else: # return ''
請求API以前,要拿到url,因此還要寫一個函數拼接url,而且調用上面的請求函數,拿到結果給視圖函數search()用.這裏先簡單一點,默認關鍵字搜索的後面兩個參數。
#!/usr/bin/env python #-*-coding:utf-8 -*- from http import HTTP class YuShuBook: isbn_url = 'http://t.yushu.im/v2/book/isbn/{} ' keyword_url = 'http://t.yushu.im/v2/book/search?q={}&start={}&count={}' @classmethod def search_by_isbn(cls, isbn): url = cls.isbn_url.format(isbn) result = HTTP.get(url) # python中將json轉化爲dict return result @classmethod def search_by_keyword(cls, keyword, count=15,start=0): url = cls.keyword_url.format(keyword, count, start) result = HTTP.get(url) return result
所以,此時的搜索的視圖函數爲(未寫完),進一步整理,將全部視圖函數放在app文件夾下對應的文件夾,這裏放在web文件下book.py中。由於啓動文件要乾淨。
def search(q, page): isbn_or_key = helper.is_isbn_or_key(q) if isbn_or_key == 'isbn': result = YuShuBook.search_by_isbn(q) else: result = YuShuBook.search_by_keyword(q) return jsonify(result)
將試圖函數放在其餘文件中,@app.toute()報錯怎麼解決。這裏要用到flask的藍圖。flask核心對象app就像一個插座,藍圖不能獨立存在,它必須插入flask核心對象中的。藍圖是如何解決視圖函數分文件的尼?咱們能夠註冊多個藍圖,而後將不一樣的視圖函數註冊到不一樣的藍圖中。雖然app是萬能插座,視圖函數也能夠直接註冊到app中,可是很差,不方便閱讀管理的等等。