django框架

django框架前导

自己手写的原始版web框架(1.0)


问
    1.我们在自己编写web框架之前需要先弄清楚web框架的作用
    2.我们编写web框架时要弄清楚需要实现什么样的功能

答
    1.web框架的作用就是连接前端与数据库,web框架可以被看成是连接两者的中间介质,也可以简单的理解为socket服务端
    2.我们编写的web框架最基础的功能就是实现浏览器访问,且可以根据不同的网址后缀获取不同的页面内容
    
手写web框架思路
    1.先编写一个socket服务端
    2.浏览器此时直接访问是无效的,因为http协议的存在,所以我们需要在服务端中添加http协议
    3.浏览器直接访问成功,再进一步,根据网址后缀的不同获取不同的页面
    4.在服务端想办法获取用户输入的网址后缀(一般是在请求首行中)
        GET /index HTTP/1.1
        Host: 127.0.0.1:8080
        Connection: keep-alive
        sec-ch-ua: "Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"
        sec-ch-ua-mobile: ?0
        sec-ch-ua-platform: "Windows"
        Upgrade-Insecure-Requests: 1
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
        Sec-Fetch-Site: none
        Sec-Fetch-Mode: navigate
        Sec-Fetch-User: ?1
        Sec-Fetch-Dest: document
        Accept-Encoding: gzip, deflate, br
        Accept-Language: zh-CN,zh;q=0.9
    5.对请求数据进行处理获得网址后缀
  
纯手写的web框架可以实现最基本的功能,但是有几个问题
    1.socket代码过于重复
    2.请求数据的处理过于繁琐
    3.后缀匹配逻辑也比较繁琐

手撸框架进阶(基于wsgiref模块)(2.0)

wsgiref模块是一个内置模块,它是很多web框架底层使用的模块
它的作用就是
    1.封装了socket代码
    2.处理了请求数据

那么针对1,0版本的手写web框架出现的问题我们就可以很好的解决前两个问题
    1.启动服务端有固定的代码
    2.相关的请求数据会被自动处理成一个大字典request
    3.我们可以根据大字典的键值对来获取不同的网址后缀名,从而返回不同的页面内容
    
现在还剩下最后一个问题:后缀匹配逻辑如何处理

代码封装优化

可以根据我们之前写购物车和选课系统的模式将后缀匹配成功后执行的代码封装成不同的函数,网址后缀名与函数做一个对应关系
1.网址后缀名与功能函数做对应
2.功能函数中存放具体的业务代码
3.功能函数和对应关系放在不同的py文件中
    views.py        存放核心业务逻辑(功能函数)
    urls.py         存放网址后缀与函数名的对应关系
    templates       存放html页面文件
4.可以将request大字典顺手传给功能函数,让业务逻辑有更多的数据可用

动静态网页

动态网页就是页面数据来源于后端,后端给什么它就显示什么
静态网页则是页面数据直接写死要想改变只能在源文件中修改

jinja2模块

可以在html页面上通过类似于后端的操作方式来操作数据
pip3 install jinja2


from jinja2 import Template


def get_dict_func(request):
    user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿强', '阿香', '阿红']}
    with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp_obj = Template(data)  # 将页面数据交给模板处理
    res = temp_obj.render({'d1': user_dict})  # 给页面传了一个 变量名是d1值是字典数据的数据
    return res

<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>

python主流web框架

1.django
    自身携带的功能组件非常多
2.flask
    自身携带的功能组件很少,但是它可以使用第三方模块
3.tornado
    异步非阻塞,速度极快效率极高

django基本使用

1.下载
    cmd下载
        pip38 install django 下载源      默认下载最新版
        pip38 install django==2.2.22 下载源     指定下载版本
    pycharm中下载
        File==>Settings==>Project:  ==>Python Interpreter  双击右边空白处搜索框中直接搜索即可,在这里可看见版本号
2.验证
    django-admin    有反应说明下载成功,或者去pycharm中查看
3.创建django项目
    django-admin startproject 项目名
4.启动django项目
    cd 项目名  # 进入项目目录
    python38 manage.py runserver 127.0.0.1:8080
    注意:
        这里启动django是可能会报错:[WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
        这是由于端口冲突导致的,换一个端口号就好了
5.pycharm创建django项目时会自动创建templates文件夹,但是配置文件中需要修改文件路径
    cmd创建的django项目没有templates文件夹,需要自己手动创建,而且吧配置文件需要自己配置一个路径

django app的概念

app即application,django是一个大的整体,app则是下面的具体的功能模块
app创建
    命令行创建
        python38 manage.py startapp 应用名
    pycharm创建
        新建django项目时可以默认创建一个,且自动注册,自己手动创建则是在Terminal中编写cmd命令创建
无论是cmd命令行创建的还是pycharm中命令创建的都需要去settings.py中注册
    INSTALLED_APPS = [
    	'app01.apps.App01Config',  # 完整写法
		'app02'  # 简写
	]

django主要目录结构

django项目目录名
    manage.py                入口文件
    templates目录            模板层(存储html文件)
    db.sqlite3文件           django自带的小型数据库(项目启动之后才会出现)
    django项目同名目录
        settings.py          配置文件
        urls.py              路由层(存储网址后缀与函数名对应关系)
        wsgi.py              wsgiref网关文件
    应用目录
        migrations           存储数据库相关记录
        admin.py             django内置的admin后台管理功能
        apps.py              注册app相关
        models.py            模型层(与数据库打交道的)
        tests.py             测试文件
        views.py             视图层(存储功能函数)
        
'''
网址后缀    ==>   路由
函数       ==>   视图函数
类         ==>   视图类
'''

小白三板斧

from django.shortcuts import render,HttpResponse,redirect

HttpResponse      可以返回字符串类型得数据
render            返回html页面并且支持传值
redirect          重定向
posted on 2023-04-08 21:50  zyg111  阅读(49)  评论(0编辑  收藏  举报