20mini-web框架 添加路由

task:用闭包和装饰器给之前的mini-web框架添加路由功能

1.mini web 框架-4-路由
dynamic/my_web.py

import time
import os
import re

template_root = “./templates”

#----------更新----------
#用来存放url路由映射
#url_route = {
#"/index.py": index_func,
#"/center.py": center_func
#}
g_url_route = dict()

#----------更新----------
def route(url):
def func1(func):
# 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用
g_url_route[url] = func
def func2(file_name):
return func(file_name)
return func2
return func1

@route("/index.py") # ----------更新----------
def index(file_name):
“”“返回index.py需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    data_from_mysql = "暂时没有数据,请等待学习mysql吧,学习完mysql之后,这里就可以放入mysql查询到的数据了"
    content = re.sub(r"\{%content%\}", data_from_mysql, content)

    return content

@route("/center.py") # ----------更新----------
def center(file_name):
“”“返回center.py需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    data_from_mysql = "暂时没有数据,,,,~~~~(>_<)~~~~ "
    content = re.sub(r"\{%content%\}", data_from_mysql, content)

    return content

def application(environ, start_response):
status = ‘200 OK’
response_headers = [(‘Content-Type’, ‘text/html’)]
start_response(status, response_headers)

file_name = environ['PATH_INFO']
# ----------更新----------
try:
    return g_url_route[file_name](file_name)
except Exception as ret:
    return "%s" % ret

2伪静态、静态和动态的区别

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

静态URL
静态URL类似 域名/news/2012-5-18/110.html 我们一般称为真静态URL,每个网页有真实的物理路径,也就是真实存在服务器里的。

优点是:

网站打开速度快,因为它不用进行运算;另外网址结构比较友好,利于记忆。

缺点是:

最大的缺点是如果是中大型网站,则产生的页面特别多,不好管理。至于有的开发者说占用硬盘空间大,我觉得这个可有忽略不计,占用不了多少空间的,况且目前硬盘空间都比较大。还有的开发者说会伤硬盘,这点也可以忽略不计。

一句话总结:

静态网站对SEO的影响:静态URL对SEO肯定有加分的影响,因为打开速度快,这个是本质。

动态URL
动态URL类似 域名/NewsMore.asp?id=5 或者 域名/DaiKuan.php?id=17,带有?号的URL,我们一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘里的。

优点是:

适合中大型网站,修改页面很方便,因为是逻辑地址,所以占用硬盘空间要比纯静态网站小。

缺点是:

因为要进行运算,所以打开速度稍慢,不过这个可有忽略不计,目前有服务器缓存技术可以解决速度问题。最大的缺点是URL结构稍稍复杂,不利于记忆。

一句话总结:

动态URL对SEO的影响:目前百度SE已经能够很好的理解动态URL,所以对SEO没有什么减分的影响(特别复杂的URL结构除外)。所以你无论选择动态还是静态其实都无所谓,看你选择的程序和需求了。

伪静态URL
伪静态URL类似 域名/course/74.html 这个URL和真静态URL类似。他是通过伪静态规则把动态URL伪装成静态网址。也是逻辑地址,不存在物理地址。

优点是:

URL比较友好,利于记忆。非常适合大中型网站,是个折中方案。

缺点是:

设置麻烦,服务器要支持重写规则,小企业网站或者玩不好的就不要折腾了。另外进行了伪静态网站访问速度并没有变快,因为实质上它会额外的进行运算解释,反正增加了服务器负担,速度反而变慢,不过现在的服务器都很强大,这种影响也可以忽略不计。还有可能会造成动态URL和静态URL都被搜索引擎收录,不过可以用robots禁止掉动态地址。

一句话总结:

对SEO的影响:和动态URL一样,对SEO没有什么减分影响。

3mini-web框架-实现伪静态url

4准备股票数据

  1. 创建数据库
    create database stock_db charset=utf8;
  2. 选择数据库
    use stock_db;
  3. 导入数据
    stock_db.sql在课件中

source stock_db.sql
4. 表结构如下
mysql> desc focus;
±----------±-----------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±----------±-----------------±-----±----±--------±---------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| note_info | varchar(200) | YES | | | |
| info_id | int(10) unsigned | YES | MUL | NULL | |
±----------±-----------------±-----±----±--------±---------------+
mysql> desc info;
±---------±-----------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±---------±-----------------±-----±----±--------±---------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| code | varchar(6) | NO | | NULL | |
| short | varchar(10) | NO | | NULL | |
| chg | varchar(10) | NO | | NULL | |
| turnover | varchar(255) | NO | | NULL | |
| price | decimal(10,2) | NO | | NULL | |
| highs | decimal(10,2) | NO | | NULL | |
| time | date | YES | | NULL | |
±---------±-----------------±-----±----±--------±---------------+

5.mini-web框架-从mysql中查询数据
my_web.py(更新)
import pymysql
import time
import os
import re

template_root = “./templates”

#用来存放url路由映射
#url_route = {
#"/index.py":index_func,
#"/center.py":center_func
#g_url_route = dict()

def route(url):
def func1(func):
# 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用
g_url_route[url]=func
def func2(file_name):
return func(file_name)
return func2
return func1

@route("/index.html")
def index(file_name):
“”“返回index.html需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    # --------添加---------
    # data_from_mysql = "暂时没有数据,请等待学习mysql吧,学习完mysql之后,这里就可以放入mysql查询到的数据了"
    db = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')
    cursor = db.cursor()
    sql = """select * from info;"""
    cursor.execute(sql)
    data_from_mysql = cursor.fetchall()
    cursor.close()
    db.close()

    content = re.sub(r"\{%content%\}", str(data_from_mysql), content)

    return content

@route("/center.html")
def center(file_name):
“”“返回center.html需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    data_from_mysql = "暂时没有数据,,,,~~~~(>_<)~~~~ "
    content = re.sub(r"\{%content%\}", data_from_mysql, content)

    return content

def application(environ, start_response):
status = ‘200 OK’
response_headers = [(‘Content-Type’, ‘text/html’)]
start_response(status, response_headers)

file_name = environ['PATH_INFO']
try:
    return g_url_route[file_name](file_name)
except Exception as ret:
    return "%s" % ret
else:
    return str(environ) + '-----404--->%s\n'

7mini-web框架-组装数据为html格式
my_web.py(更新)
import pymysql
import time
import os
import re

template_root = “./templates”

#用来存放url路由映射
#url_route = {
#"/index.py":index_func,
#"/center.py":center_func
#}g_url_route = dict()

def route(url):
def func1(func):
# 添加键值对,key是需要访问的url,value是当这个url需要访问的时候,需要调用的函数引用
g_url_route[url]=func
def func2(file_name):
return func(file_name)
return func2
return func1

@route("/index.html")
def index(file_name):
“”“返回index.html需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    # data_from_mysql = "暂时没有数据,请等待学习mysql吧,学习完mysql之后,这里就可以放入mysql查询到的数据了"
    db = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')
    cursor = db.cursor()
    sql = """select * from info;"""
    cursor.execute(sql)
    data_from_mysql = cursor.fetchall()
    cursor.close()
    db.close()

    html_template = """
        <tr>
            <td>%d</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" systemidvaule="%s">
            </td>
            </tr>"""

    html = ""

    for info in data_from_mysql:
        html += html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[1])


    content = re.sub(r"\{%content%\}", html, content)

    return content

@route("/center.html")
def center(file_name):
“”“返回center.html需要的页面内容”""
# return “hahha” + os.getcwd() # for test 路径问题
try:
file_name = file_name.replace(".py", “.html”)
f = open(template_root + file_name)
except Exception as ret:
return “%s” % ret
else:
content = f.read()
f.close()

    # data_from_mysql = "暂时没有数据,,,,~~~~(>_<)~~~~ "
    db = pymysql.connect(host='localhost',port=3306,user='root',password='mysql',database='stock_db',charset='utf8')
    cursor = db.cursor()
    sql = """select i.code,i.short,i.chg,i.turnover,i.price,i.highs,j.note_info from info as i inner join focus as j on i.id=j.info_id;"""
    cursor.execute(sql)
    data_from_mysql = cursor.fetchall()
    cursor.close()
    db.close()

    html_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/%s.html"> <span class="glyphicon glyphicon-star" aria-hidden="true"></span> 修改 </a>
            </td>
            <td>
                <input type="button" value="删除" id="toDel" name="toDel" systemidvaule="%s">
            </td>
        </tr>
        """

    html = ""

    for info in data_from_mysql:
        html += html_template % (info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[0], info[0])

    content = re.sub(r"\{%content%\}", html, content)

    return content

def application(environ, start_response):
status = ‘200 OK’
response_headers = [(‘Content-Type’, ‘text/html’)]
start_response(status, response_headers)

file_name = environ['PATH_INFO']
try:
    return g_url_route[file_name](file_name)
except Exception as ret:
    return "%s" % ret
else:
    return str(environ) + '-----404--->%s\n'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值