web框架,jinja2模块,django框架,django项目目录结构

  • web框架的本质
  • 纯手撸web框架

  • 基于wsgiref模块的web框架

  • 动静态网页

  • jinja2模块

    • 模板语法(用mysql数据库)

  • python主流web框架

  • django框架简介

  • django基本操作命令

    • 命令行操作

    • pycharm操作

  • 命令行与pycharm操作的区别

  • django目录结构

  • django小白必会三板斧

    • HttpResponse

    • render

    • redirect


web框架的本质

  1. web框架本质上可以看成是一个功能强大的socket服务端

  2. 用户的浏览器可以看成是拥有可视化界面的socket客户端

  3. 两者通过网络请求实现数据交互

  4. 三层架构       客户端(浏览器\应用)<>web框架<>数据库

纯手撸web框架

  web框架可以简单的理解为是  基于互联网的web服务端>>>:socket服务端

1.socket服务端代码
2.HTTP协议
3.根据网址后缀的不同请求不同的内容
4.请求方式
	GET
    	朝服务端索要数据
 	POST
    	朝服务端提交数据
5.从请求数据格式中筛选出用户输入的网址后缀
	target_url = data.decode('utf8').split(' ')[1]
6.代码的缺陷
	1.socket代码重复编写造轮子
	2.针对请求数据格式的处理复杂且重复
 	3.针对不同网址后缀的匹配方式过于lowB
import socket


server = socket.socket()  # TCP协议
server.bind(('127.0.0.1', 8080))  # IP协议 PORT协议
server.listen(5)  # 连接池


while True:
    sock, address = server.accept()
    data = sock.recv(1024)
    sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
    # print(data.decode('utf8'))  # 从字符串中截取出需要的内容
    target_url = data.decode('utf8').split(' ')[1]  # / /index /login /reg /xxx
    if target_url == '/index':
        sock.send(b'index view')
    elif target_url == '/login':
        sock.send(b'login view')
    elif target_url == '/reg':
        sock.send(b'reg view')
    else:
        sock.send(b'404 error')

基于wsgiref模块的web框架

  1. wsgiref内部封装了socket代码对请求数据的处理

  2. 用法 from wsgiref.simple_server impor make_server

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回给客户端的数据
    """
    print(request)  # 自动将请求数据全部处理成字典k:v键值对形式
    response('200 OK', [])  # 固定代码 无需掌握
    return [b'hello big baby']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
    server.serve_forever()  # 永久启动

  1.wsgiref模块解决了两个问题
      1.socket代码重复编写造轮子
      2.针对请求数据格式的处理复杂且重复
  

  2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化先从大字典中查找出记录网址后缀的键值对)
      1.不推荐使用连续的多个if判断
      2.针对面条版的代码首先应该考虑封装成函数

def index(request):
            return 'index'
        def login(request):
            return 'login'
        def register(request):
            return 'register'
        def error(request):
            return '404 error'
        urls = (
            ('/index', index),
            ('/login', login),
            ('/register', register),
         )	

3.根据py文件中功能的不同划分到不同的py文件(模块化)

urls.py 对应关系(在后面的django中我们叫路由)
view.py 功能函数
start.py 启动文件
templates文件夹 储存html的文件夹

写道这里我们应该明白,在项目搭建中要知道创建文件夹分门别类


动静态网页

  1. 静态网页

    网页上的内容都是写死的,如果想要修改只能修改源码

  2. 动态网页

    网页上的内容不全部都是死的,有些是动态传入

  3. 动态网页实际需求

    后端获取当前事件,然后让前端页面实现展示

      1.字符串替换

      2. 将字典给数据传递给html页面并且想要在页面上操作字典数据

    我们无法自己实现>>>: 在html页面上使用类似于后端的语法操作数据   jinja2


jinja2模块

 1. 第三方模块  jinja2   

  2. pip install jinja2

  3. from jinja2 import Template

from jinja2 import Template
def get_dict(request):
    user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    with open(r'templates/myhtml04.html','r',encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
    return res
<!-- 字典取值三种  []  .get  .k键-->
<body>
    <h1>{{ data }}</h1>  
    <h1>{{ data['name'] }}</h1>
    <h1>{{ data.get('pwd') }}</h1>
    <h1>{{ data.hobby }}</h1>
</body>

模板语法(用mysql数据库)

{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}

python主流web框架

  1. django矿建

大而全 自身携带的功能非常的多 类似于航空母舰
        缺陷:开发小项目的时候使用该框架有点笨重(大材小用)

  2. flask框架

小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
        缺陷:受限于第三方模块的开发

  3. tornado框架

异步非阻塞 该框架到可以作为游戏服务器
        缺陷:上手难度是三者最高的

  4. fastapi框架

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

快速  高效   智能   简单   标准化   简短

  5. sanic框架

Sanic 是一个基于 Python 3.5+ 的 web 框架,依托于 uvloop、asyncio 等事件循环和异步并发模块,旨在提供支持异步高并发请求的 web 服务

Sanic 的使用和 Flask 非常相似

Sanic 最大的特色是支持 异步 方式处理并发请求,在开发中可以使用 asyncawait 关键字实现非阻塞响应请求。

  


django框架简介

  1. 版本

    1.x: 同步   1.11

    2.x: 异步    2.2

    3.x: 异步    3.2

ps:你无论使用什么版本都可以 区别不大 2.2

  2. 启动注意事项

1.计算机名称尽量不要有中文

2.项目中所有的py文件名尽量不要用中文

3.不同版本的python解释器配合不同版本的django 会有一些报错

        仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错

         找到那一行代码 把逗号删除即可

            widgets.py  152  

4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

  3. 验证django是否下载成功

   cmd终端输入django-admin     有反应就是成功


django基本操作命令

命令行操作

 1. 创建一个django项目

    进入一个盘符(你想要在那个盘创建django项目)

    盘符:

   django-admin startproject 项目名

  2. 启动django项目

    先切换到项目目录下

      cd 项目名

    再执行启动目录

      python38 manage.py runserver ip:prot

  3. 访问django服务端

     浏览器直接访问

 4. 创建app应用

1. django框架类似于是一个空壳子 给你提供所需的资源

2.至于到底要写哪些功能 需要通过创建app来划分

  eg:django初始项目可以看成是一所大学
               app就相当于是大学里面的各个学院


python38 manage.py startapp 应用名

在我们运行django项目后会自动生成一个文件   db.sqlite3

pycharm操作

在启动django项目的时候 一定要确保一个端口只有一个项目

有时候因为版本问题 我们启动的时候会报错,下面是解决措施

修改端口号


命令行与pycharm操作的区别

1.命令行不会自动创建templates文件夹

2.命令行不会在配置文件编写关于templates文件夹的配置

  如果你在命令行中创建了项目那么要在settings文件夹中创建'DIRS': [os.path.join(BASE_DIR, 'templates')]

3.pycharm自动创建的第一个应用会自动注册到配置文件中

4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来


django目录结构

-项目文件夹名称

  --项目同名文件夹

    ----__init__.py         很少用,主要做一些冷门配置

    ----settings.py        项目配置文件

    ----urls.py          总路由层

    ----wsgi.py          django服务,基本不用

  --manage.py           项目入口文件

  --db.sqlite3             运行项目后自动创建(django自带的小型数据库)

  --应用名文件夹          通过命令创建(可以创建任意个数)

    ----__init__.py          很少用 主要做一些冷门配置

    ----migrations文件夹     存储数据迁移记录

    ----admin.py         django提供的后台管理

    ----apps.py          用于配置文件的应用注册(创建的应用都需要去配置文件中注册)

    ----models.py         模型层(与数据库相关)

    ----views.py          视图层(编写当前应用核心业务逻辑代码)

    ----tests.py           自带的测试文件

主要的几个层

urls.py            路由层(对应关系)
views.py         视图层(核心逻辑层,代码)
templates       模板层(存放html文件,在这里叫模板)
models.py       模型层(存放一些数据表)


django小白必会三板斧

HttpResponse

主要用于直接返回字符串类型的数据     

# Create your views here.
def index(request):
    return HttpResponse('你好啊 我是django2.2.22版本')

render

主要用于返回html页面    并且支持模板语法

def func(request):
    user_dict = {'name': 'jason', 'pwd': 123}
    return render(request, 'func.html', {'data': user_dict})

因为我们在settings文件中设置了'DIRS': [os.path.join(BASE_DIR, 'templates')]

redirect

主要用于页面重定向(当我们点击一个页面跳转的时候,跳到了另一个页面     淘宝购买没登录会让你先登录) 

def login(request):
    # return redirect('https://www.baidu.com/')
    return redirect('/index/')
posted @   没错,干就完了!  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示