Django学习笔记
- Django官网 : https://docs.djangoproject.com/en/4.2/
- Django中文文档参考网站:https://yiyibooks.cn/
初识Django
安装Django
pip install django
创建Django项目
Django中项目会有一些默认的文件和文件夹
-
在终端
-
打开终端
-
进入到某个目录(项目放在哪里)
-
执行命令创建项目
"D:\py3.10.11\Scripts\django-admin.exe" startproject 项目名称
如果
D:\py3.10.11\Scripts\django-admin.exe
已加入系统环境变量。django-admin.exe startproject 项目名称
-
最后目录里面就多出来创建的几个项目
-
-
pycharm中创建Django项目
特殊说明:
由于用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的一些重要信息:
-
创建app: 使用以下命令在Django项目中创建一个新的app:
python manage.py startapp app_name
这将在项目根目录下创建一个新的文件夹,其中包含了app的相关文件结构。
除此之外,还可以在pycharm中点击Tools工具中的Run manage.py Task
选项,让我们在输入的时候python manage.py可以不写,只写python manage.py后面的命令
-
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请求的视图函数。
-
app的配置: 在项目的
settings.py
中,需要将app添加到INSTALLED_APPS
列表中,以便Django知道哪些app被包含在项目中。 -
URL配置: 每个app可以拥有自己的URL配置,通过在app目录下创建
urls.py
文件,并在项目的主URL配置中包含它。这样,每个app都可以处理自己的URL路由。 -
视图函数: 在app的
views.py
文件中,定义处理HTTP请求的视图函数。这些视图函数接收请求并返回HTTP响应,可以通过模板引擎渲染页面或返回JSON数据等。 -
数据模型: 在app的
models.py
文件中定义数据模型,这些模型描述了数据在数据库中的结构。Django会自动根据这些模型生成相应的数据库表,并提供了ORM(对象关系映射)来简化对数据库的操作。 -
后台管理: 在app的
admin.py
文件中,可以将定义的数据模型注册到Django的管理后台,方便进行管理和编辑数据。
总之,Django中的app是一种组织代码的方式,它允许你将应用程序划分为小的、可重用的部分,有助于更好地组织代码、提高可维护性,并使开发过程
启动Django
-
确保app已注册
找到apps.py,找到name参数
最后在setting.py中的INSTALLED_APPS中最后一行添加一行信息
-
编写url和视图函数的对应关系(urls.py)
-
编写视图函数
-
启动Django项目
-
命令行启动
python manage.py runserver
-
pycharm启动
启动之后便可访问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),
]
然后运行就得到如下效果
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文件夹。
引用静态文件
模板语法
本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理
模板语法示例如下:
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>
运行结果如下:
模板继承
定义模板: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 %}
请求和相应
请求和相应
登录案例
数据库操作
-
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框架。
安装第三方模块
pip install mysqlclient
ORM
ORM可以帮助我们:
- 创建、修改和删除数据库中的表 (不用写SQL语句)。【无法创建数据库】
- 操作表中的数据
-
自己创建数据库
-
django链接数据库
在settings.py文件中进行配置和修改。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_test', # 数据库名字 'USER': 'root', 'PASSWORD': 'root', 'HOST': 'localhost', # 那台机器安装了MySQL 'PORT': 3306, } }
-
django操作表
创建表:在models.py文件中
在终端中执行命令:
python manage.py makemigrations python manage.py migrate
注意:app需要提前注册。
若要在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:
-
1,手动输入一个值。
-
设置默认值
age = models.IntegerField(default=2)
-
允许为空
data = models.IntegerField(null=True, blank=True)
以后在开发中如果想要对表结构进行调整:
-
在models.py文件中操作类即可。
-
命令
python manage.py makemigrations python manage.py migrate
-
-
操作表中的数据
# #### 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中间件
中间件初体验
-
定义中间件
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', ]