Python mini-web框架4:添加路由和MySQL功能

一、用装饰器完成路由功能

  • 1.1、用装饰器完成路由功能1

    import re
    
    
    def index():
        with open("./templates/index.html") as f:
            content = f.read()
    
        my_stock_info = "测试一下,数据"
    
        content = re.sub(r"\{%content%\}",my_stock_info,content)
    
        return content
    
    
    def center():
        with open("./templates/center.html") as f:
           content = f.read()
    
        my_stock_info = "这是从数据库查询出来的数据"
    
        content = re.sub(r"\{%content%\}",my_stock_info,content)
    
        return content
    
    
    URL_FUNC_DICT = {
    
      "/index.py":index,
      "/center.py":center
    }
    
    
    def application(evn,start_reponse):
          
          start_reponse('200 OK',[('Content-Type','text/html;charset=utf-8')])
          file_name = evn['PATH_INFO']
          func = URL_FUNC_DICT[file_name]
    
          return func()
    

    提示:主要是URL_FUNC_DICT 字典的引入,不用再像以前那样的判断 file_name 是否存在了,如下

    file_name = evn['PATH_INFO']
    func = URL_FUNC_DICT[file_name]
    return func()
    

    取代了下面的段代码

    if  file_name == "/index.py":
         return index()
    elif file_name == "/center.py":
         return center()
    else:
         return "Hello world !"
    

    缺点:URL_FUNC_DICT字典还需要手动配置,以及file_name不存在的时候会出现问题,下面我们看 2 的优化

  • 1.2、用装饰器完成路由功能2
    目的:去掉1.1中的代码

    URL_FUNC_DICT = {
    
         "/index.py": index,
         "/center.py": center
    }
    

    优化方式,使用带参数的装饰器来实现 URL_FUNC_DICT 来自动添加元素,代码如下

    # 定义一个空子典
    URL_FUNC_DICT = dict()
    
    
    def route(url):
         """
         带参数的装饰器来做路由
         :param url: 请求的url
         :return: 返回一个装饰器
         """
         def set_func(func):
             # 往空子典里面添加元素
             URL_FUNC_DICT[url] = func
             def call_func(*args, **kwargs):
                  return func(*args, **kwargs)
              return call_func
         return set_func
    

    完整的代码如下

    import re
    
    
    # 定义一个空子典
    URL_FUNC_DICT = dict()
    
    
    # 用来存放url路由映射
    def route(url):
          """
          带参数的装饰器来做路由
          :param url: 请求的url
          :return: 返回一个装饰器
          """
          def set_func(func):
              # 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用
              URL_FUNC_DICT[url] = func
    
              def call_func(*args, **kwargs):
                   return func(*args, **kwargs)
    
              return call_func
    
          return set_func
    
    
    @route("/index.py")
    def index():
           with open("./templates/index.html") as f:
                content = f.read()
    
           my_stock_info = "测试一下,数据"
           content = re.sub(r"\{%content%\}", my_stock_info, content)
    
           return content
    
    
    @route("/center.py")
    def center():
           with open("./templates/center.html") as f:
                 content = f.read()
    
           my_stock_info = "这是从数据库查询出来的数据"
           content = re.sub(r"\{%content%\}", my_stock_info, content)
           return content
    
    
    def application(evn, start_reponse):
           start_reponse('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
    
           file_name = evn['PATH_INFO']
           func = URL_FUNC_DICT[file_name]
    
           return func()
    
  • 1.3、用装饰器完成路由功能3:解决 字典URL_FUNC_DICT里面不存在键值对的情况

    • 方式一:使用 key in dict,也就是判断一个键在字典中是否在存在,如下

      jk_dict = {"a":1,"b":2}
      key = "a"
      
      if key in jk_dict:
      
           print("%s的value是"%key,jk_dict[key])
      else:
           print("键%s在字典里面不存在"% key)
      
    • 方式二:使用 try

      jk_dict = {"a":1,"b":2}
      key = "c"
      
      try:
           print("%s的value是" % key, jk_dict[key])
      except Exception as ret:
           print("异常信息是%s"%str(ret))
      
    • 对比两种方式的选择哪一个更好
      使用 try 还是比较好的,因为它具有异常转发的功能,而方式一没有

  • 1.4、简单的解释一下路由 route

    • 路由route:路由的功能是数据的转发,上面使用到路由的功能是字典的映射

二、伪静态、静态和动态的区别
目前开发的网站其实真正意义上都是动态网站,只是URL上有些区别,一般URL分为静态URL、动态URL、伪静态URL,他们的区别是什么?

  • 2.1、静态URL
    静态URL类似 域名/news/hh/login.html 我们一般称为真静态URL,每个网页有真实的物理路径,也就是真实存在服务器里的。
    • 优点是:网站打开速度快,因为它不用进行运算;另外网址结构比较友好,利于记忆。
    • 缺点是:最大的缺点是如果是中大型网站,则产生的页面特别多,不好管理。至于有的开发者说占用硬盘空间大,我觉得这个可有忽略不计,占用不了多少空间的,况且目前硬盘空间都比较大。还有的开发者说会伤硬盘,这点也可以忽略不计。
    • 一句话总结: 静态网站对SEO的影响:静态URL对SEO肯定有加分的影响,因为打开速度快,这个是本质。
  • 2.2、动态URL
    动态URL类似 域名/NewsMore.asp?id=5 或者 域名/DaiKuan.php?id=17,带有?号的URL,我们一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘里的。
    • 优点是:适合中大型网站,修改页面很方便,因为是逻辑地址,所以占用硬盘空间要比纯静态网站小。
    • 缺点是:因为要进行运算,所以打开速度稍慢,不过这个可有忽略不计,目前有服务器缓存技术可以解决速度问题。最大的缺点是URL结构稍稍复杂,不利于记忆。
    • 一句话总结: 动态URL对SEO的影响:目前百度SE已经能够很好的理解动态URL,所以对SEO没有什么减分的影响(特别复杂的URL结构除外)。所以你无论选择动态还是静态其实都无所谓,看你选择的程序和需求了。
  • 2.3、伪静态URL
    伪静态URL类似 域名/course/2.html 这个URL和真静态URL类似。他是通过伪静态规则把动态URL伪装成静态网址。也是逻辑地址,不存在物理地址。
    • 优点是:URL比较友好,利于记忆。非常适合大中型网站,是个折中方案。
    • 缺点是:设置麻烦,服务器要支持重写规则,小企业网站或者玩不好的就不要折腾了。另外进行了伪静态网站访问速度并没有变快,因为实质上它会额外的进行运算解释,反正增加了服务器负担,速度反而变慢,不过现在的服务器都很强大,这种影响也可以忽略不计。还有可能会造成动态URL和静态URL都被搜索引擎收录,不过可以用robots禁止掉动态地址。
    • 一句话总结:使用的时候和动态URL一样,但是伪静态对SEO没有什么减分影响。

三、mini_frame框架添加MySQL功能

  • 3.1、进入mysql

    mysql -u 用户名 -p密码
    

    如:

    mysql -u root -p456123love
    
  • 3.2、创建数据库 stock_db以及表和数据stock_db.sql文件

    • <1>、创建数据库 stock_db以及使用

      # 创建数据库 `stock_db `
      create database stock_db charset=utf8;
      # 使用数据库 `stock_db `
      use stock_db;
      
    • <2>、导入数据(在练习的时候需要这个文件的可以找我要)

      source stock_db.sql;
      

      提示:stock_db.sql是一个 sql文件,里面是一些表创建以及数据导入的代码,在执行上面的代码的是一定要在 stock_db.sql文件同一个路径

    • <3>、focusinfo 的表结构如下

      mysql> desc focus;
      
      focus表结构
      mysql> desc info;
      
      info表结构
  • 3.3、mysql数据库查询的正式使用,效果如下:


    效果
    • def index():里面的代码如下

      def index():
      
            with open("./templates/index.html") as f:
                  content = f.read()
      
            # my_stock_info = "测试一下,数据"
      
            # 创建Connection连接
            conn = connect(host='ironman.ren', port=3306, database='stock_db', user='账号名', password='密码', charset='utf8')
            # 获得Cursor对象
            cursor = conn.cursor()
            cursor.execute("select * from info;")
            stock_infos = cursor.fetchall()
            cursor.close()
            conn.close()
      
            tr_template = """<tr>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>%s</td>
                <td>
                  <input type="button" value="添加" id="toAdd" name="toAdd" systemidvalue="000007">
                </td>
              </tr>
             """
      
           html = ""
      
           for line_info in stock_infos:
      
               html += tr_template%(line_info[0],line_info[1],line_info[2],line_info[3],line_info[4],line_info[5],line_info[6],line_info[7])
      
           content = re.sub(r"\{%content%\}", str(html), content)
      
           return content
      
    • def center():里面的效果与代码如下

      `def center():`里面的效果与代码如下

      def center():
            with open("./templates/center.html") as f:
                  content = f.read()
      
            # 创建Connection连接
            conn = connect(host='ironman.ren', port=3306, database='stock_db', user='账号名', password='密码',
                  charset='utf8')
            # 获得Cursor对象
            cursor = conn.cursor()
            cursor.execute("select i.code,i.short,i.chg,i.turnover,i.price,i.highs,f.note_info from info as i inner join focus as f on i.id = f.info_id;")
            stock_infos = cursor.fetchall()
            cursor.close()
            conn.close()
      
            tr_template = """<tr>
               <td>%s</td>
               <td>%s</td>
               <td>%s</td>
               <td>%s</td>
               <td>%s</td>
               <td>%s</td>
               <td>%s</td>
               <td>
                  <a type="button" class="btn btn-default btn-xs" href="/update/300268.html"> <span class="glyphicon glyphicon-star" aria-hidden="true"></span> 修改 </a>
               </td>
               <td>
                  <input type="button" value="删除" id="toDel" name="toDel" systemidvalue="300268">
               </td>
             </tr>
             """
      
            html = ""
      
            for line_info in stock_infos:
                 html += tr_template % (line_info[0], line_info[1], line_info[2], line_info[3], line_info[4], line_info[5], line_info[6])
      
            content = re.sub(r"\{%content%\}", str(html), content)
      
            return content
      
    • 上述两个代码最主要的理解查询数据后再拼接,返回一个content

补充:

  • 面向切面:装饰器添加功能,让原本的框架去调用,不用管其他的,只需要写自己函数内的代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容