Django框架

发布时间 2023-11-05 22:52:59作者: 尹少欣

一、目录结构

manage.py         管理项目的命令行工具,启动项目、生成app、执行数据迁移等
settings.py       项目配置文件,注册app、配置模型(数据库)等
asgi.py           django的服务器,异步接受网络请求
wsgi.py           django的服务器,同步接受网络请求
urls.py           路由配置文件,将URL匹配到对应的视图函数(处理请求的函数)
templates目录      存放模板文件,即HTML文件

二、环境部署

2.1 创建Django项目

  1. 下载Django框架

    pip install django -i https://pypi.douban.com/simple
    
  2. PyCharm创建Django项目

    image-20231031214601383

2.2 连接数据库-MySQL

  1. 运行MySQL+创建一个数据库(django_pro)

  2. pycharm中,连接数据库

    image-20231031214954308

    image-20231030220019771

  3. 在项目的配置文件(settings.py)中,配置数据库;

    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': BASE_DIR / 'db.sqlite3',
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'django_pro',
            'USER': 'root',
            'PASSWORD': '123.com',
            'HOST': '127.0.0.1',
            'PORT': 3306,
        }
    }
    
  4. 将数据迁移到数据库(django_pro)中

    python manage.py makemigrations    创建迁移文件
    python manage.py migrate           执行迁移命令
    

    image-20231030220450779

三、开发流程

3.1 APP注册

  1. 生成app

    - 命令:python manage.py startapp AppName
    - 目录结构
    	- __init__.py                       APP初始化文件,对某些数据进行初始设置
    	- admin.py                          后台管理,管理员(可能看不懂代码)通过该页面可以直接操纵数据库中的表
    	- apps.py                           APP的配置文件,定义了该app的名称等
    	- models.py                         模型文件,编写操纵数据库的代码
    	- tests.py                          对app做一些测试
    	- views.py                          视图文件,编写视图函数(处理请求)的地方
    
  2. 注册app

    在项目的配置文件(settings.py)的INSTALLED_APPS列表中,添加app的名称
    

3.2 数据迁移

  1. 运行MySQL,并在项目中连接上MySQL

  2. 生成迁移文件

    python manage.py makemigrations
    
  3. 执行迁移命令

    python manage.py migrate
    

3.3 路由配置

  1. 在app的视图文件(views.py)中,定义视图函数

  2. 采用跟路由的方式进行配置:在项目的路由文件(urls.py)中,将路由添加到urlpatterns列表

    - path(url路径,对应的视图函数)
    - url路径:客户端(浏览器)会自动在url的后面加上‘/’,因此,路由中也要一‘/’结尾;一个视图函数	可以对应多个不同的路由;网站首页应为空和index两个路由;url路径中可以定义参数,该参数会被传	入其对应的视图函数中;
    - 视图函数:不要忘记导包
    

3.4 模板文件

  1. 在项目的templates目录中(如果在app中创建了templates模板目录,需要在项目的配置文件中进行路径配置),创建HTML文件
  2. 在某个视图函数中,进行指定(即return),该视图函数与模板文件应该具有这样的关系:客户端请求该视图函数就能看到这个模板文件

四、示例

4.1 djangoPro

4.1.1 创建项目

  1. 新建项目
    image-20231101205633720

  2. 创建Django项目

    image-20231101205749414

  3. 连接数据库

    image-20231101210042980

    image-20231101210403501

  4. app注册

    image-20231101210848349

    image-20231101210943733

4.1.2 创建首页

  1. 在templates目录中,创建index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body style="background-color: slategrey">
        <div style="display: inline-block">
            <img style="margin-left: 30px;" src="https://i2.hdslb.com/bfs/archive/7f9cd6bd48b0e1e84ca5491d0a410d93bebaace7.png" alt="" width="350px">
            <img style="margin-left: 30px;" src="https://img0.baidu.com/it/u=3901441618,621808000&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=1200" alt="" width="230px">
            <img style="margin-left: 30px;" src="https://img0.baidu.com/it/u=1518200957,2910210326&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=500" alt="" width="350px">
        </div>
    
        <h1 style="color: gold; background-color: black; text-align: center">欢迎来到Django站点,请继续你的django开发</h1>
        <h1 style="color: gold; background-color: black; text-align: center">欢迎来到Django站点,请继续你的django开发</h1>
        <h1 style="color: gold; background-color: black; text-align: center">欢迎来到Django站点,请继续你的django开发</h1>
    
    </body>
    </html>
    
  2. 在app01的views.py中,定义index函数

    def index(request):
        return render(request, "index.html")
    
  3. 在项目的urls.py中,配置首页路由

    from django.contrib import admin
    from django.urls import path
    import app01.views
    
    urlpatterns = [
        # 默认配置
        path('admin/', admin.site.urls),
    
        # app01
        path('', app01.views.index),
        path('index/', app01.views.index),
    
    ]
    
  4. 启动服务器

    python manage.py runserver
    

    image-20231101215150213

4.1.3 创建模型

  • 在app01的models.py中,创建表结构

    from django.db import models
    
    
    # 一个类就是一张表
    class UserInfo(models.Model):
        # 创建name、sex、age三个字段
        name = models.CharField(max_length=30)
        sex = models.CharField(max_length=30)
        age = models.IntegerField(defalut=18)
    
  • 生成迁移文件

    image-20231103092007802

  • 执行迁移命令

    image-20231103092106603

  • 在app01的后台管理文件(admin.py)中,进行后台注册

    from django.contrib import admin
    from app01 import models
    
    # Register your models here.
    admin.site.register(models.UserInfo)
    
  • 创建后台管理员账号

    image-20231103143956007

  • 启动服务器,访问后台

    image-20231103144123035

    image-20231103144314419

  • 添加数据

    image-20231103144443198

4.1.4 创建模板

  • 在templates目录中,创建userlist.html

  • 创建视图函数userList

    from django.shortcuts import render
    from app01.models import *
    
    
    # Create your views here.
    def index(request):
        return render(request, "index.html")
    
    def userList(request):
        users = UserInfo.objects.all()
    
        # 以字典形式返回数据
        return render(request, "userlist.html", {"users":users})
    
  • 在模板中接收视图函数的返回

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户列表</title>
    </head>
    <body>
        <ul>
                {% for user  in users %}
                    <li>
                        姓名:{{ user.name }}&nbsp;&nbsp;&nbsp;性别:{{ user.sex }}&nbsp;&nbsp;&nbsp;年龄:{{ user.age }}
                    </li>
                {% endfor %}
                
        </ul>
    </body>
    </html>
    
  • 配置路由"userlist/"

  • 启动服务器,访问userlist页面

    image-20231103155057497

4.1.5 路由匹配参数

https://www.jb51.net/python/293397s0z.htm

  • urls.py

    """
    URL configuration for djangoPro project.
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/4.2/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    import app01.views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
    
        # app01
        path('', app01.views.index),
        path('index/', app01.views.index),
        path('userlist/', app01.views.userList),
        path('getParams/<int:id>/', app01.views.getParams),
    
    ]
    
  • views.py

    from django.shortcuts import render
    from app01.models import *
    
    
    # Create your views here.
    def index(request):
        return render(request, "index.html")
    
    
    def userList(request):
        users = UserInfo.objects.all()
        return render(request, "userlist.html", {"users": users})
    
    
    def getParams(request, id):
        return render(request, "getPrams.html", {"id": id})
    
  • getParams.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>匹配参数</title>
    </head>
    <body>
        您输入的参数是<span style="font-size: 22px; color: gold; background-color: black;">{{ id }}</span>
    </body>
    </html>
    

4.1.6 request对象

https://blog.csdn.net/weixin_43988680/article/details/124654798

  • 视图函数

    def requests(request):
        # 常用值
        results = [
            f"路径:{request.path}",
            f"方法:{request.method}",
            f"GET:{request.GET}",
            f"请求体:{request.body}",
            f"META:{request.META}",
            f"session: {request.session}",
            f"cookies: {request.COOKIES}",
        ]
    
        return render(request, "requests.html", {"results": results})
    
  • 模板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>request对象常用属性及方法</title>
    </head>
    <body>
    <ul>
        {% for result in results %}
            <li>
                {{ result }}
            </li>
        {% endfor %}
        
        <li>
        </li>
    </ul>
    </body>
    </html>
    
  • 路由配置

    path('requests/', app01.views.requests)
    

4.1.7 models对象

  • 视图函数

    def modelObj(request):
        # 模型拿到的内容是每一行记录(的对象)
        users = list()
        for item in UserInfo.objects.all():
            users.append(item)
        numbers = UserInfo.objects.count()
    
        return render(request, "models.html", {"users": users, "numbers": numbers})
    
  • 模板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模型对象常用方法</title>
    </head>
    <body>
        当前数据库中一共有{{ numbers}}条数据,如下所示
        <ol>
            {% for user in users %}
                <li>{{ user.name }}</li>
            {% endfor %}
    
        </ol>
    </body>
    </html>
    
  • 路由配置

    path('models/', app01.views.modelObj)