python_flask小項目實例-編一個小網站


要完成是這樣一個網站:http://www.yushu.im/,該網站主要是贈送書的一個平台(公益性的)

網站框架功能:

網站的搭建

前期准備(用pycharm直接創建應該也可以,感覺直接創簡單)

新建文件夾,創建虛擬環境(創建虛擬環境的好處就不說了),安裝需要的包。

1)安裝pipenv包,pip install pipenv

2) 在項目文件下用pipenv創建虛擬環境,pipenv install

3)按照提示pipenv shell進入虛擬環境

進入虛擬環境后發現只有虛擬環境提供的包:

4)安裝一些需要的包,首先flask,這時候安裝不是pip,是pipenv install flask

關於虛擬環境pipenv

進入:pipenv shell

退出:exit

安裝與卸載包: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
helper

這樣視圖函數就比較干凈:(當然還沒寫完)

 如何在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
YuShu_Book.py

因此,此時的搜索的視圖函數為(未寫完),進一步整理,將所有視圖函數放在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中,但是不好,不方便閱讀管理的等等。

 

 

 

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM