django学习笔记

今日内容概要

  • 纯手撸web框架
  • 基于wsgiref模块
  • 动静态网页
  • jinja2模板语法
  • python主流web框架
  • django框架简介
  • django基本操作命令
  • django目录结构
  • django小白必会三板斧

今日内容详细

纯手撸web框架

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

1.利用socket模块搭建简易版本的服务端

2.遵循HTTP协议---四大特性,数据格式,响应状态码

3.根据网址后缀的不同请求不同的内容

4.请求方式

GET:朝服务端索要数据

POST:朝服务端提交数据

5.从请求数据格式中筛选出用户输入的网址后缀

target_url = data.decode('utf8').split(' ')[1]

HTTP请求数据;/favicon.ico直接忽略,不影响判断;利用字符串切割和索引取值获取相应数据。

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')

上述框架的缺陷:

1.socket代码重复编写

2.针对请求数据格式的处理复杂且重复

3.针对不同网址后缀的匹配方式过于低端

基于wsgiref模块

wsgiref模块内部封装了socket代码和对请求数据的处理

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()  # 永久启动

wsgiref模块解决了两个问题

1.socket代码重复编写

2.针对请求数据格式的处理复杂且重复

思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)

1.从request获取的字典中查找出记录网址后缀的键值对

2.不推荐使用连续的多个if判断

3.针对面条版的代码首先应该考虑封装成函数

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),
)

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

urls.py          存储对应关系
views.py         存储功能函数
start.py         存储启动文件
templates文件夹   存储html文件

# 以后要想新增功能,只需要在urls.py中添加对应关系,view.py中编写函数

动静态网页

静态网页

静态网页就是页面上的数据直接写死的,要想改变只能修改源码。

动态网页

动态网页就是页面上的数据不是全部写死的,有些是动态获取(后端传入)。eg:1.页面上展示当前时间(后端获取传递给前端界面); 2.页面上展示数据库数据(后端链接数据库查询数据再传递给页面)。

实际需求
后端代码回去当前时间 然后让前端页面展示
1.字符串替换
2.将字典数据传递给html页面并且想要在页面上操作字典数据
我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据

def get_time(request):
    # 1.获取当前时间
    import time
    c_time = time.strftime('%Y-%m-%d %X')
    # 2.读取html文件
    with open(r'templates/get_time.html','r',encoding='utf8') as f:
        data = f.read()
    # 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换
    new_data = data.replace('asdaksdjal',c_time)
    return new_data

jinja2模板语法

jinjia2模块能够让我们在html文件内使用类似于后端的语法来操作各种数据类型。

下载:在cmd命令窗口输入'pip3 install jinja2'下载第三方模块jinja2。

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

模板语法

<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 

{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}
<!--作用:获取数据库中的数据展示到前端页面-->

框架请求流程

urls.py

后缀与函数名对应关系
  ('/index',register)
    后缀专业名词称之为'路由'
    函数名专业名词称之为'视图函数'
urls.py专业名词称之为'路由层'

views.py

专门编写业务逻辑代码
  可以是函数 也可以是类
    函数专业名词称之为'视图函数'
    类专业名词称之为'视图类'
views.py专业名词称之为'视图层'

templates文件夹

专门存储html文件
  html文件专业名词称之为'模板文件'
templates文件夹专业名词称之为'模板层'

models.py

存储与数据库表相关的类
    models.py专业名词称之为'模型层'

img

python主流web框架

框架 说明 缺陷
django 大而全 自身携带的功能非常的多 类似于航空母舰 开发小项目的时候使用该框架有点笨重(大材小用)
flask 小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块 受限于第三方模块的开发
tornado 异步非阻塞 该框架快到可以作为游戏服务器 上手难度是三者最高的
fastapi,sanic 最近流行的 抽空可以看看

框架虽然多,但是内部逻辑大差不差,我们重点学习一个即可>>>:django,如果你是小白切记不要同时学习上述框架

django框架简介

版本问题

1.X:同步    1.11
2.X:同步    2.2
3.X:异步    3.2
ps:我们学习的时候,可以基于django2.2.22版本学习,与1.X功能几乎一致。3.X仅仅是多了一个功能

下载

在cmd窗口输入'pip3 install django==2.2.22'(用版本2.2.22为例子)。如果之前下载了其他版本不用管,自动替换!

启动注意事项

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

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

3.不同版本的python解释器配合不同版本的django会有一些报错,找到报错信息提示的那一行代码,把逗号删除即可

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

验证django是否下载成功

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

django基本操作命令

命令行操作

1.创建django项目

django-admin startproject 项目名

2.启动django项目

1.先切换到项目目录下
    cd 项目名
2.执行启动目录
    python38 manage.py runserver ip:port

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

3.访问django服务端

浏览器直接访问

4.创建app应用

"""
django框架类似于是一个空壳子,给你提供所需的资源,至于到底要写哪些功能,需要通过app来划分
eg:django初始项目可以看成是一所大学,app就相当于是大学里面的各个学院
"""
python38 manage.py startapp 应用名

pycharm操作django

1.创建django项目

image

2.创建更多的app

pycharm左上角tools,选择run manage.py task。

startapp app名称

3.启动项目

直接点击pycharm右上方的绿色箭头启动即可

命令行与pycharm操作的区别

1.命令行不会自动创建templates文件夹
2.命令行不会在配置文件编写关于templates文件夹配置
    'DIRS':[os.path.join(BASE_DIR,'templates')]
3.pycharm自动创建的第一个应用会自动注册到配置文件中
4.针对db.sqlite3文件不用去在乎它有没有创建,只要运行了django会自动出来

django目录结构

django项目目录
    项目同名文件夹
        __init__.py       很少用,主要做一些冷门配置
        settings.py       项目配置文件
        urls.py           对应关系(目前简单理解:网址名后缀跟函数名)
        wsgi.py           django服务,基本不用
    应用名文件夹(可以有多个)
        migrations文件夹   orm相关(数据库打交道的记录)
        __init__.py       很少用,主要做一些冷门配置
        admin.py          django自带的后台管理
        apps.py           创建应用之后用于应用的注册
        models.py         存储与数据库表相关的类
        tests.py          自带的测试文件
        view.py           存储业务相关的逻辑代码(函数,类)
    manage.py             django入口文件
    templates文件夹       存储项目所需的html文件
    db.sqlite3            自带的小型数据库

创建应用之后 一定要去配置文件中注册才能生效

完整语法:'app01.apps.App01Config'
简写语法:'app01'

django小白必会三板斧

启动django项目之后如何添加更多的功能?通过之前直接编写的web框架,我们可以知道添加更多的功能可以去编写urls.py和views.py。

django自带重启功能。当识别到项目中代码有变化之后隔段时间会自动重启,但是有时候较慢。

与浏览器打交道的视图函数都应该有返回值,常见的就是下列三个。

HttpResponse
    主要用于返回字符串类型的数据
render
    主要用于返回html页面,并且支持模板语法(django自己写的)
redirect
    主要用于页面重定向,括号内可以写其他网站的全称,也可以写自己网站的后缀

案例:
def index(request):
    return HttpResponse('你好啊 django的学习可容不得半点马虎!!!')
    return render(request, 'index.html',{'name':'jason'})
    return redirect('https://www.sogo.com')
posted @   空白o  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示