01.在学习Django框架之前所需要了解的知识点


  "https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">

class="text-center">这是一个非常牛逼的页面

fh.html fh.html

 问题:

    ---  服务端代码重复

    ---  手动处理http数据格式过于繁琐

基于wsgiref模块

解决了上述两个问题

from wsgiref.simple_server import make_server


def run(request,response):
    """
    :param request:请求相关的所有数据
    :param response:响应相关的所有数据
    :return:返回给浏览器的数据
    """
    response('200 OK',[]) # 响应首行 响应头
    current_path = request.get("PATH_INFO")
    if current_path == '/index':
        return [b'index']
    elif current_path == '/login':
        return [b'login']
    return [b'404 error']


if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)  # 一旦被访问会全部交给run函数处理
    server.serve_forever()  # 启动服务端

 问题

  ---  网址很多的情况下如何匹配

  ---  网址多匹配如何解决

  ---  功能复杂代码块如何解决

封装处理

1.定义一个网址与功能函数的对应关系
    # 地址与功能的对应关系
    urls = [
        ('/index',index_func),
        ('/login',login_func),
        ('/reg',reg_func),
    ]
2.按照功能的不同划分成不同的py文件
    urls.py views.py 服务端.py
3.书写服务端代码
     func = None
    # for循环判断
    for url_tuple in urls:  # (),()
        if current_path == url_tuple[0]:
            # 将匹配到的函数名赋值给func变量
            func = url_tuple[1]
            break
    # 判断func是否有值
    if func:
        # 执行对应的函数
        res = func(request)
    else:
        res = errors(request)
    return [bytes(res,encoding='utf8')]

动静态网页

静态网页:
  页面上的数据全部都是写死的,万年不变
动态网页:
  页面上的数据来源于后端(代码、数据库)

1.访问网址展示当前时间(由后端模块生成并展示到html页面)

def get_time_func(request):
    from datetime import datetime
    current_time = datetime.now().strftime('%Y-%m-%d %X')
    with open(r'get_time.html','r',encoding='utf8') as f:
        data = f.read()  # 字符串
    data = data.replace('sadadadad',current_time)
    return data

2.后端有一个字典,将该字段传递给html页面,并且在该页面上还可以使用字典取值的各种操作
 python强大而优秀的三方库为我们解决了这个问题
 实现模板渲染 模板语法的第三方模块:jinja2模块
  安装方式:pip3 install jinja2
ps:该模块是flask框架必备的模块 所以下载flask也会自动下载该模块

def get_dict_func(request):
        user_dict = {"username":'jason','password':123,'hobby':'study'}
        from jinja2 import Template
        with open(r'templates/get_dict.html','r',encoding='utf8') as f:
            data = f.read()  # 字符串
        temp = Template(data)
        # 将user_dict传递给get_dict.html页面 在该页面上使用变量名user_data调用
        res = temp.render(user_data=user_dict)
        return res

模板语法(用近似于python的语法在html文件上操作数据) 红色标记为固定语法,jinja2支持字典、列表等数据类型,在前端页面文件中的使用方式也和python中如出一辙。

{{user_data}}
{{user_data['username']}}
{{user_data.get('password')}}
{{user_data.hobby}}
        
{%for user_dict in data_list%}
       
           {{user_dict.id}}
           {{user_dict.name}}
           {{user_dict.age}}
      
{%endfor%}

3.获取MySQL数据库数据展示到页面上

def get_db_func(request):
    import pymysql
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        db='db666',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'select * from userinfo'
    affect_rows = cursor.execute(sql)
    res1 = cursor.fetchall()  # [{},{},{}]
    with open(r'templates/get_db.html','r',encoding='utf8') as f:
        data = f.read()  # 字符串
    temp = Template(data)
    # 将user_dict传递给get_dict.html页面 在该页面上使用变量名user_data调用
    res = temp.render(data_list=res1)
    return res

总结

1.纯手撸web框架

  • 1.socket代码需要我们自己写
  • 2.http格式的数据自己处理(只能拿到用户输入的路由)

2.基于wsgiref模块

  • 1.封装了socket代码
  • 2.处理了http数据格式

  web服务网关接口

  • 1.请求来的时候解析http格式的数据,封装成了大字典
  • 2.响应走的时候把数据打包成符合http格式,在返回给浏览器

3.根据功能的不同拆分成不同的文件夹

  urls.py 路由与视图函数对应关系:主要是匹配浏览器请求的视图页面并交由对应视图函数处理

  views.py 视图函数:得到浏览器的页面请求及浏览器携带的请求数据,进行html页面提取、数据处理、模板渲染并返回

  templates 模板文件夹:放有所有前端html页面文件夹

  • 1.第一步添加路由与视图函数的对应关系
  • 2.去views中书写功能代码
  • 3.如果需要使用到html则去模板文件夹中操作

4.jinja2模板语法

  {{···}}
  {%···%}

5.简易版本web框架流程图
  

Python三大主流web框架

1.django框架:


特点:大而全,自带的功能组件非常非常非常的多!类似于航空母舰


不足之处: 有时候过于笨重


2.flask框架:


  特点:小而精,自身的功能组件非常非常非常的少!类似于游骑兵

           但是第三方模块非常之多,如果把第三方模块全部叠加起来完全可以盖过django并且也越来越像django


  不足之处: 比较依赖于第三方的开发者,有时候也会受限于第三方模块

      ps:三行代码就可以启动一个flask后端服务

3.tornado框架:


  特点:异步非阻塞,支持高并发

          速度非常的快 快到可以开发游戏服务器
      ps:Sanic、FastAPI...

 A : socket部分B: 路由与视图匹配C: 模版语法
django 别人的, wsgiref模块 自己写的 自己的(没有jinja2模块好用 但是也很方便)
flask 别人的,wsgiref模块封装之后werkzeug 自己写的 别人的,jinja2模块
tornado 自己写的 自己写的 自己写的