xml地图|网站地图|网站标签 [设为首页] [加入收藏]
数据与路由,当索引不好用时
分类:编程

数据

图书数据库的地址

# 基地址
http://t.yushu.im
# 关键字搜索
http://t.yushu.im/v2/book/search?q={}&start={}&count={}
# isbn搜索
http://t.yushu.im/v2/book/search/isbn/{isbn}
# 豆瓣api
https://api.douban.com/v2/book/1003078

目录:

转发请注明出处:

搜索关键字

  1. 根据上面的地址可以知道搜索的时候有两种方式,而对于isbn搜索,又分为两种isbn13 由13个0-9在数字组成,isbn10 由10表0-9表数字组组成,中间可能包含' - ' ,所以要分开来判断
  2. 在函数中要注意:isdigit()可以判断是否为数字 ,replace()用来替换,
@app.route("/search/<q>/<page>")
def search(q,page):
    """
    搜索书籍路由
    :param q: 关键字 OR isbn
    :param page: 页码
    """
    isbn_or_key = 'key'
    # 1. 判断长度是否为13且是否为数字
    if len(q) == 13 and q.isdigit():
        isbn_or_key = 'isbn'
    # 2. 把-替换掉,判断是否为纯数字
    short_q = q.replace('-', '')
    if '-' in q and len(short_q) == 10 and short_q.isdigit():
        isbn_or_key = 'isbn'
    pass
  1. 多逻辑判断的时候,应该把结果看着为假的放到前面,对数据库操作的放到后面,这样有利于节约资源

  一 、字典(哈希、关系数组)

实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程(

简单的重构

  1. 上面的代码都写到视图中这样不妥,体现不了封装性,看起来不好,应该把一个实现的功能封装起来,建立一个函数,方便日后的管理
  2. 在目录下建立一个helper.py文件,这个文件主要就是提供一些方法,把上面的内容放到这里,只需要返回一个值就可以了
# -*- coding: utf-8 -*-

def is_isbn_or_key(word):
    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
  1. 在主文件中调用这个方法就可以了,记得传值,和接收返回的值
# -*- coding: utf-8 -*-

from flask import Flask,make_response
# 1. 这里要导入
from helper import is_isbn_or_key

app = Flask(__name__)
app.config.from_object('config')

@app.route('/book/search/<q>/<page>')
def search(q,page):
    # 2. 调用方法即可
    is_or_key = is_isbn_or_key(q)
    pass

if __name__ == '__main__':
    app.rundebug=app.config['DEBUG'])

  二、创建和访问字典

图片 1图片 2

requests请求

  1. 因为这个项目要访问不同的网址,所以在目录下新建一个http.py文件,专门用来提供访问网址
  2. 这里使用的requests,要先进行安装,注意:代码写的时候一定要简洁,千万不要使用python的关键字,以免与Python的模块冲突并导致此错误,把这个类名http改为别的名称
# -*- coding: utf-8 -*-

import requests
class aaa:

    # 传入url和是否返回的是json数据,这里是静态方法
    @staticmethod
    def get(url,return_json=True):
        # 发送get请求
        r = requests.get(url)
        # 因为有的url返回的json数据,但是有的并不是,所以加一个判断,不是的话返回文本
        # 还要判断状态码,200的话就是访问成功有数据
        if r.status_code != 200:
            return {} if return_json else ''
        return r.json() if return_json else r.text

        # 下面的写法太low
        # if r.status_code == 200:
        #     if return_json:
        #         return r.json()
        #     else:
        #         return r.text
        # else:
        #     if return_json:
        #         return {}
        #     else:
        #         return ''

  三、课时25课后习题及答案

/// unity container 的AOP可以完成IOC的功能,在我们使用AOP的时候
/// 也就完成了依赖项的实例化。

/// 完成DI
IUnityContainer container = new UnityContainer();
container.RegisterType<IFooRepository, FooRepository>()
    .RegisterType<IBarRepository, BarRepository>();


/// BarSerice的AOP
container.AddNewExtension<Interception>()
    .RegisterType<IFooService, FooService>() /// FooService的AOP
    .Configure<Interception>()
    .SetInterceptorFor<IFooService>(new InterfaceInterceptor());


/// BarSerice的AOP
container.AddNewExtension<Interception>()
    .RegisterType<IBarService, BarSerice>()
    .Configure<Interception>()
    .SetInterceptorFor<IBarService>(new InterfaceInterceptor());

var invoke = container.Resolve<IOCInvoke>();
invoke.Run();
sw.Stop();

Console.WriteLine("花费时间: {0}", sw.Elapsed);

Console.Read();

从API中获取数据

  1. 首先在目录下定义一个类,用于用于获取数据,ShanqiuBook,
# -*- coding: utf-8 -*-

from http import aaa
class ShanqiuBook:

    isbn_url = 'http://t.yushu.im/v2/book/search/isbn/{}'
    keyword_url = 'http://t.yushu.im/v2/book/search?q={}&count={}&start={}'


    # 根据isbn进行搜索,这里使用这个静态装饰器,调用类变量更加的方便
    @classmethod
    def search_by_isbn(cls,isbn):
        # 调用类变量,
        url = cls.isbn_url.format(isbn)
        # 调用上面的方法用于请求网址
        result = aaa.get(url)
        # 这里返回的是json数据,但是在py中就是字典了
        return result

    # 根据关键字进行搜索
    @classmethod
    def search_by_keyword(cls,keyword,count=15,start=0):
        url = cls.keyword_url.format(keyword,count,start)
        result = aaa.get(url)
        return result
  1. 然后在视图中获取返回的数据
# -*- coding: utf-8 -*-

from flask import Flask
from helper import is_isbn_or_key

from flask import jsonify
# 实例化
from shanqiu_book import ShanQiuBook

app = Flask(__name__)
# 载入这个配置文件
app.config.from_object('config')

@app.route('/book/search/<q>/<page>')
def search(q,page):
     is_or_key = is_isbn_or_key(q)
     if is_or_key == 'isbn':
         # 这里直接使用使用类名调用就可以
         result = ShanQiuBook.search_by_isbn(q)
    else:
         result = ShanQiuBook.search_by_keyword(q)

    # 因为返回的是json数据,要手动的进行解析,这样写的话非常麻烦
    # return json.dumps(result), 200, {'content-type': 'application/json'}
    # 这里使用flask自带的jsonify替换麻烦的json.dumps和元组
     return jsonify(result)


if __name__ == '__main__':
    app.run(debug=app.config['DEBUG'])

 

View Code

将视图函数拆分到单独的文件中

  1. 如果视图函数都写在主文件中,不利于维护,而是应该把他们放入到一个文件中,每一个模块就是一个试图,用的时候直接引用,这样有利于维护
  2. 在根目录下建立一个app/web文件夹,在这个文件夹下面建立一个book.py文件,专门用来存放book模块,然后在主文件中引用这个模块就可以了,book.py
# -*- coding: utf-8 -*-
from flask import jsonify
from helper import is_isbn_key
from ShanqiuBook import ShanqiuBook

# 为了让book.py模块可以使用app对象
from demo import app

@app.route('/book/search/<q>/<page>')
def hello(q,page):

    # 调用方法判断用户是根据什么查的
    is_or_key = is_isbn_key(q)
    if is_or_key == 'isbn':
        result = ShanqiuBook.search_by_isbn(q)
    else:
        result = ShanqiuBook.search_by_keyword(q)

    return jsonify(result)
  1. 此时的主文件中
# -*- coding: utf-8 -*-
from flask import Flask
# 为了可以注册book.py中的路由
from app.web import book

app = Flask(__name__)
app.config.from_object('config')

if __name__ == '__main__':
    app.run(debug=app.config['DEBUG'])
  1. 但是这样写的话,会出现404,因为出现了循环引用

*********************************

代码链接: 密码:dz2z

循环引入流程分析

  1. 因为在整个的流程中,app两次初始化,如图
  2. 图片 3
  3. 整个流程中,出现了两次核心app对象的初始化,注册路由是在蓝色流程中初始化的app注册的。但是启动服务是红色流程中的app启动的
  4. book中注册路由所使用的app对象,是他自己所导入fisher模块的app对象(蓝色流程中),而不是红色主流程中所实例化的app对象
  5. 问题1:因为都是由fisher引入book,一个模块只会引入另一个模块一次,所以只执行了一次book
  6. 问题2:由于一次是主流程执行fisher文件;一次是由book模块导入 fisher
  7. 为了验证我们的结论,我们在app实例化,启动,注册路由是哪个地方加入日志信息,
print("id为"+str(id(app))+"的app注册路由")
@app.route("/book/search/<q>/<page>")
def search(q, page):
    isbn_or_key = is_isbn_or_key(q)
    if isbn_or_key == 'isbn':
        result = YuShuBook.search_by_isbn(q)
    else:
        result = YuShuBook.search_by_key(q)
    return jsonify(result)
  1. 主文件
app = Flask(__name__)
print("id为"+str(id(app))+"的app实例化")
app.config.from_object("config")
# 为了可以注册book.py中的路由
from app.web import book
if __name__ == '__main__':
    print("id为" + str(id(app)) + "的app启动")
    app.run(debug=app.config['DEBUG'])
  1. 结果如下
id为92323280的app实例化
id为107142192的app实例化
id为107142192的app注册路由
id为92323280的app启动

可以看到注册路由的app,和启动服务的app不是同一个app。并且最后启动的app是最先实例化的app,也就是红色主流程的app;而注册路由的app是后实例化的app,也就是由book导入fisher模块的蓝色流程的app

一 、字典(哈希、关系数组)

 

*********************************

转发请注明出处:

在Python中也有字典,又称为哈希(hash),有些地方称为关系数组。

字典是Python中唯一的映射类型,映射是数学上的一个术语,指的是两个元素集合之间元素相互“对应”关系,如下图所示:

 图片 4

映射类型区别于序列类型,序列类型一数组的形式存储,通过索引的方式来获取相应位置的值,一般索引值与对应位置存储的数据是毫无关系的。举个例子:

>>> brand = ["李宁","耐克","阿迪达斯","鱼C工作室"]
>>> slogan = ["一切皆有可能","Just do it","Impossible is nothing","让编程改变世界"]
>>> print("鱼C工作号的口号是:",slogan[brand.index("鱼C工作室")])
鱼C工作号的口号是: 让编程改变世界

列表brand和slogan的索引和相对的值是没有任何关系的,可以看出,唯一有关系的就是两个列表之间,索引号相同的元素是有关系的(品牌对应口号嘛),所以这里通过“brand.index("鱼C工作室")”这样的语句,间接地实现通过品牌查找对应口号的功能。这种方式有点差强人意,所以,需要有字典这种映射类型的出现。

 

***********************

二、创建和访问字典

***********************

本文由澳门新葡亰手机版发布于编程,转载请注明出处:数据与路由,当索引不好用时

上一篇:买卖股票的最佳时机,对C语言的认识 下一篇:结合造型,各类内置方法
猜你喜欢
热门排行
精彩图文