Django学习笔记

  • Django官网 : https://docs.djangoproject.com/en/4.2/
  • Django中文文档参考网站:https://yiyibooks.cn/

初识Django

安装Django

pip install django

创建Django项目

Django中项目会有一些默认的文件和文件夹

  1. 在终端

    • 打开终端

    • 进入到某个目录(项目放在哪里)

    • 执行命令创建项目

      "D:\py3.10.11\Scripts\django-admin.exe" startproject 项目名称
      

      如果D:\py3.10.11\Scripts\django-admin.exe已加入系统环境变量。

      django-admin.exe startproject 项目名称
      
    • 最后目录里面就多出来创建的几个项目

  2. pycharm中创建Django项目

    image-20230702215656958

特殊说明

由于用pycharm创建的Django项目会多出一个templates文件夹,若用不到可以将其删除,同时删除settings.py文件中的DIRS内容,此为默认templates目录存放路径

默认文件介绍

mysite2
|--manage.py 						[项目的管理、启动项目、创建app、数据管理] [不要动]
|--mysite2
	|--__init__.py
	|--settings.py					[项目配置文件] [常常修改]
	|--urls.py						[URL和函数的对应关系] [常常修改]
	|--asgi.py						[接收网络请求] [不要动]
	|--wsgi.py						[接收网络请求] [不要动]

APP

在Django中,"app"是指一个可重用的组件,用于实现应用程序中的特定功能。Django的项目通常由多个应用组成,每个应用负责处理不同的功能模块,例如用户认证、博客功能、论坛等。应用的使用可以使得项目更加模块化、可维护性更高,方便团队协作和代码重用。

下面是关于Django中的app的一些重要信息:

  1. 创建app: 使用以下命令在Django项目中创建一个新的app:

    python manage.py startapp app_name
    

    这将在项目根目录下创建一个新的文件夹,其中包含了app的相关文件结构。
    除此之外,还可以在pycharm中点击Tools工具中的Run manage.py Task选项,让我们在输入的时候python manage.py可以不写,只写python manage.py后面的命令
    在这里插入图片描述

  2. app目录结构: 一个Django app的典型目录结构如下:

    markdownCopy codeapp_name/
    ├── migrations/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    ├── views.py
    └── ...
    
    • migrations/: 存放与数据库迁移相关的文件,用于管理数据模型的变更。
    • __init__.py: 将app目录变为Python包。
    • admin.py: 注册数据模型,以便在Django管理后台进行管理。
    • apps.py: app的配置文件,固定的,不用动。
    • models.py: 定义数据模型。
    • tests.py: 编写测试用例。
    • views.py: 定义处理HTTP请求的视图函数。
  3. app的配置: 在项目的settings.py中,需要将app添加到INSTALLED_APPS列表中,以便Django知道哪些app被包含在项目中。

  4. URL配置: 每个app可以拥有自己的URL配置,通过在app目录下创建urls.py文件,并在项目的主URL配置中包含它。这样,每个app都可以处理自己的URL路由。

  5. 视图函数: 在app的views.py文件中,定义处理HTTP请求的视图函数。这些视图函数接收请求并返回HTTP响应,可以通过模板引擎渲染页面或返回JSON数据等。

  6. 数据模型: 在app的models.py文件中定义数据模型,这些模型描述了数据在数据库中的结构。Django会自动根据这些模型生成相应的数据库表,并提供了ORM(对象关系映射)来简化对数据库的操作。

  7. 后台管理: 在app的admin.py文件中,可以将定义的数据模型注册到Django的管理后台,方便进行管理和编辑数据。

总之,Django中的app是一种组织代码的方式,它允许你将应用程序划分为小的、可重用的部分,有助于更好地组织代码、提高可维护性,并使开发过程

启动Django

  • 确保app已注册

    找到apps.py,找到name参数

    image-20230702224838965

    最后在setting.py中的INSTALLED_APPS中最后一行添加一行信息

    image-20230702225051853

  • 编写url和视图函数的对应关系(urls.py)

    url和视图函数的对应关系

  • 编写视图函数

    image-20230702225958398

  • 启动Django项目

    • 命令行启动

      python manage.py runserver
      
    • pycharm启动

      1

    启动之后便可访问http://127.0.0.1:8000/index/

快速上手

再写一个页面

比如说要继续写页面可以先编辑view.py视图函数

from django.shortcuts import render, HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("hello world")

def user_list(request):
    return HttpResponse("用户列表")

def user_add(request):
    return HttpResponse("添加用户")

然后在urls.py里面来指定访问路由

from django.contrib import admin
from django.urls import path

from app_test import views
urlpatterns = [
    # path('admin/', admin.site.urls),
    # www.xxx.com/index/ -> 函数
    path('index/', views.index),

    path('user/list/', views.user_list),

    path('user/add/', views.user_add),
]

然后运行就得到如下效果

image-20230703114507690

templates模板

示例:

编辑views.py

def user_list(request):
    # 1.优先去根目录的templates中寻找(提前先配置)【不配置无效】
    # 2.去app目录下的templates目录寻找user_list.html(根据app的注册顺序,逐一去他们的templates目录中找)
    return render(request, "user_list.html")

在templates文件夹中创建一个user_list.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>用户列表</h1>
</body>
</html>

然后运行即可访问http://127.0.0.1:8000/user/add/页面

静态文件

在开发过程中一般将:图片、CSS、JS 都会当静态文件处理

在app目录下创建static文件夹。

image-20211124103828667

引用静态文件

image-20211124103947169

模板语法

本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理

image-20211124113409740

模板语法示例如下:

urlpatterns = [
    path('tpl/', views.tpl),
]
def tpl(request):
    name = "jhon"
    roles = ["管理员", "CEO", "保安"]
    user_info = {"name":"lily", "salary":10000, 'role':'CEO'}

    data_list = [
        {"name": "lily", "salary": 10000, 'role': 'CEO'},
        {"name": "Joe", "salary": 10000, 'role': 'CEO'},
        {"name": "Lihua", "salary": 10000, 'role': 'CEO'},
    ]
    return render(request, "tpl.html", {"n1": name, "n2": roles, "n3":user_info, "n4":data_list})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>模板语法的学习</h1>
    <div>{{ n1 }}</div>
    <div>{{ n2 }}</div>

    <div>{{ n2.0 }}</div>
    <div>{{ n2.1 }}</div>
    <div>{{ n2.2 }}</div>

    <div>
        {% for item in n2 %}
            <span>{{ item }}</span>
        {% endfor %}

    </div>
<hr>

    {{ n3 }}
    {{ n3.name }}
    {{ n3.salary }}
    {{ n3.role }}
<ul>
    {% for k, v in n3.items %}
        <li>{{ k }} = {{ v }}</li>
    {% endfor %}

</ul>
<hr>
{{ n4.1 }}
    <br>
{{ n4.1.name }}

<hr>
{% if n1 == "test" %}
    <h1>哒哒哒哒哒</h1>
{% else %}
    <h1>哈哈哈哈哈</h1>
{% endif %}
</body>
</html>

运行结果如下:

image-20230703163219251

模板继承

定义模板:layout.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugin...min.css' %}">
    {% block css %}{% endblock %}
</head>
<body>
    <h1>标题</h1>
    <div>
        {% block content %}{% endblock %}
    </div>
    <h1>底部</h1>
    
    <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
    {% block js %}{% endblock %}
</body>
</html>

继承模板:

{% extends 'layout.html' %}

{% block css %}
	<link rel="stylesheet" href="{% static 'pluxxx.css' %}">
	<style>
		...
	</style>
{% endblock %}


{% block content %}
    <h1>首页</h1>
{% endblock %}


{% block js %}
	<script src="{% static 'js/jqxxxin.js' %}"></script>
{% endblock %}

请求和相应

请求和相应

image-20211124142250396

登录案例

image-20211124151119553

image-20211124151127364

image-20211124151135563

数据库操作

  • MySQL数据库 + pymysql

    import pymysql
    
    # 1.连接MySQL
    conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd="root123", charset='utf8', db='unicom')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    
    # 2.发送指令
    cursor.execute("insert into admin(username,password,mobile) values('wupeiqi','qwe123','15155555555')")
    conn.commit()
    
    # 3.关闭
    cursor.close()
    conn.close()
    
  • Django开发操作数据库更简单,内部提供了ORM框架。

    image-20211124151748712

安装第三方模块
pip install mysqlclient
ORM

ORM可以帮助我们:

  • 创建、修改和删除数据库中的表 (不用写SQL语句)。【无法创建数据库】
  • 操作表中的数据
  1. 自己创建数据库

  2. django链接数据库

    在settings.py文件中进行配置和修改。

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'django_test',  # 数据库名字
            'USER': 'root',
            'PASSWORD': 'root',
            'HOST': 'localhost',  # 那台机器安装了MySQL
            'PORT': 3306,
        }
    }
    

    image-20230704221633630

  3. django操作表

    创建表:在models.py文件中

    image-20211124154658774

    在终端中执行命令:

    python manage.py makemigrations
    python manage.py migrate
    

    注意:app需要提前注册。

    image-20230704222737786

    若要在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:

    • 1,手动输入一个值。

    • 设置默认值

      age = models.IntegerField(default=2)
      
    • 允许为空

      data = models.IntegerField(null=True, blank=True)
      

    以后在开发中如果想要对表结构进行调整:

    • 在models.py文件中操作类即可。

    • 命令

      python manage.py makemigrations
      python manage.py migrate
      
  4. 操作表中的数据

    
    # #### 1.新建 ####
    # Department.objects.create(title="销售部")
    # Department.objects.create(title="IT部")
    # Department.objects.create(title="运营部")
    # UserInfo.objects.create(name="武沛齐", password="123", age=19)
    # UserInfo.objects.create(name="朱虎飞", password="666", age=29)
    # UserInfo.objects.create(name="吴阳军", password="666")
    
    # #### 2.删除 ####
    # UserInfo.objects.filter(id=3).delete()
    # Department.objects.all().delete()
    
    # #### 3.获取数据 ####
    # 3.1 获取符合条件的所有数据
    # data_list = [对象,对象,对象]  QuerySet类型
    # data_list = UserInfo.objects.all()
    # for obj in data_list:
    #     print(obj.id, obj.name, obj.password, obj.age)
    
    # data_list = [对象,]
    # data_list = UserInfo.objects.filter(id=1)
    # print(data_list)
    # 3.1 获取第一条数据【对象】
    # row_obj = UserInfo.objects.filter(id=1).first()
    # print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)
    
    
    # #### 4.更新数据 ####
    # UserInfo.objects.all().update(password=999)
    # UserInfo.objects.filter(id=2).update(age=999)
    # UserInfo.objects.filter(name="朱虎飞").update(age=999)
    

Django中间件

中间件初体验

image-20211127142838372

  • 定义中间件

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class M1(MiddlewareMixin):
        """ 中间件1 """
    
        def process_request(self, request):
    
            # 如果方法中没有返回值(返回None),继续向后走
            # 如果有返回值 HttpResponse、render 、redirect
            print("M1.process_request")
            return HttpResponse("无权访问")
    
        def process_response(self, request, response):
            print("M1.process_response")
            return response
    
    
    class M2(MiddlewareMixin):
        """ 中间件2 """
    
        def process_request(self, request):
            print("M2.process_request")
    
        def process_response(self, request, response):
            print("M2.process_response")
            return response
    
  • 应用中间件 setings.py

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'app01.middleware.auth.M1',
        'app01.middleware.auth.M2',
    ]
    
  • 在中间件的process_request方法

    如果方法中没有返回值(返回None),继续向后走
    如果有返回值 HttpResponse、render 、redirect,则不再继续向后执行。
    
中间件案例——登录功能校验
  • 编写中间件

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse, redirect
    
    
    class AuthMiddleware(MiddlewareMixin):
    
        def process_request(self, request):
            # 0.排除那些不需要登录就能访问的页面
            #   request.path_info 获取当前用户请求的URL /login/
            if request.path_info == "/login/":
                return
    
            # 1.读取当前访问的用户的session信息,如果能读到,说明已登陆过,就可以继续向后走。
            info_dict = request.session.get("info")
            print(info_dict)
            if info_dict:
                return
    
            # 2.没有登录过,重新回到登录页面
            return redirect('/login/')
    
  • 应用中间件

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'app01.middleware.auth.AuthMiddleware',
    ]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值