python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Django框架

Python中的Django框架基础及安装教程

作者:踏遍星河0806

本文介绍了Django框架的基本概念、安装、项目创建和启动方法,以及路由配置、ORM思想和使用,Django是一个全栈框架,遵循MTV模式,提供自动化工具和ORM,简化了Web开发流程,感兴趣的朋友跟随小编一起看看吧

一.Django框架概述

Django是一个基于Python的高级Web框架,遵循“快速开发”和“DRY(Don't Repeat Yourself)”原则。以下为其核心特点:

二.Django框架安装

方式一:命令行安装Django

安装:pip install Django==3.2.25
卸载:pip uninstall Django

三.Django项目创建

方式一:命令行创建

django-admin startproject 项目名称

方式二:通过pycharm创建项目

四.Django项目启动

方式一:命令行启动

cmd窗口进入Django项目文件夹:

python manage.py runserver

如果需要修改启动端口号,那么:python manage.py runserver 8080

方式二:通过pycharm进行项目启动

Django项目默认的端口号为8000

五.Django项目路由配置

1.自定义路由配置:

urlpatterns = [
    path('login/', login),
]
def login(request):
    print("访问到了登录函数")
    return render(request,"login.html")

容易发生的错误:

1.函数没有返回值时报错:

2.函数返回值格式不正确:

3.页面正常访问中,当需要加载静态资源(css文件、js文件、图片 …... ),需要在setting.py文件中做配置

STATIC_URL = "/static/"
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

页面跳转-转发与重定向

转发(render)

def page(request):
    return render(request, "main.html")
urlpatterns = [
    path("login/", login),
    path("login_action/", login_action),
    path("page/", page),
]

重定向(redirect)

def main(request):
    return render(request, "main.html")
def page(request):
    return redirect("/main/")
urlpatterns = [
    path("login/", login),
    path("login_action/", login_action),
    path("page/", page),
    path("main/", main),
]

转发和重定向的区别

转发(Forward)和重定向(Redirect)的核心区别在于:转发是服务器内部行为,一次请求且地址栏不变;重定向是客户端行为,两次请求且地址栏变化。
‌核心机制差异‌
    ‌行为主体‌。
        ‌转发‌:由服务器内部完成(如通过RequestDispatcher),客户端无感知
        ‌重定向‌:服务器返回状态码(如302)和新URL,客户端重新发起请求
    ‌请求次数与效率‌。
        ‌转发‌:仅一次请求,性能更高
        ‌重定向‌:两次独立请求,效率较低
‌功能特性对比‌
    ‌地址栏变化‌。
        ‌转发‌:地址栏显示原始URL
        ‌重定向‌:地址栏更新为新URL
    ‌数据共享能力‌。
        ‌转发‌:通过request.setAttribute()共享数据
        ‌重定向‌:需依赖Session或URL参数传递数据
    ‌应用范围限制‌。
        ‌转发‌:仅限同一Web应用内资源
        ‌重定向‌:可跨应用或访问外部资源

六.ORM思想

ORM(对象关系映射)的核心优势主要体现在以下方面:

提升开发效率

通过将数据库表结构映射为程序对象,开发者无需手动编写复杂的SQL语句即可完成数据操作,显著提升编码效率。框架如 SQLAlchemy 通过声明式映射实现Python类与数据库表的关联,支持链式查询构建。 ‌

简化数据操作逻辑

ORM框架提供数据消毒、事务管理、动态查询生成等功能,开发者只需关注业务逻辑而无需深究数据库细节。

降低维护成本

统一的数据模型定义便于团队协作开发,且能快速适配不同数据库,Django、Ruby on Rails、等框架通过ORM实现跨平台开发,减少因数据库迁移导致的代码修改。 ‌

增强安全性

通过参数化查询和预编译语句减少SQL注入风险 Laravel 等框架的ORM组件自动处理数据过滤和转义操作,降低数据污染风险。 ‌

促进架构规范

强制采用MVC架构模式,使业务逻辑与数据访问逻辑分离,代码结构更清晰。例如,Android Room库通过ORM强制实现数据访问层与业务层的隔离。

七.Django中使用ORM(掌握!!)

第一步:改造上述Django代码结构,需要创建特殊文件夹

方式一:通过命令行创建并配置

python manage.py startapp app

方式二:通过pycharm创建

第二步:在项目的settings.py文件中配置数据库信息

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "spt2505", # 数据库名称
        "HOST":"127.0.0.1", # 数据库所在IP地址
        "PORT":3306, # 数据库端口号
        "USER":"root", # 用户名
        "PASSWORD":"root" # 密码
    }
}

第三步:确定需要用pymysql来操作数据库

在与settings.py文件同一等级的init.py文件中配置pymysql

import pymysql
pymysql.install_as_MySQLdb()

第四步:配置映射信息

在app文件夹下的models.py文件中做ORM映射

class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=20)

第五步:通过命令实现ORM映射(Django程序通过类信息自动创建表格)

python manage.py makemigrations
python manage.py migrate
报错备注:
Django版本与MySQL 5.5的兼容性‌:
Django与MySQL的版本兼容性如下:
    ‌Django 2.0及以上版本支持MySQL 5.5及以上版本‌。
    ‌Django 2.2及以上版本支持MySQL 5.5、5.6和5.7版本‌。
    ‌Django 3.0及以上版本支持MySQL 5.6、5.7和8.0版本‌‌。
因此,‌Django 4.2版本不再支持MySQL 5.5‌,因为Django 4.2官方不再支持MySQL 5.5,这会导致不兼容问题‌。
解决方案
    ‌降低Django版本‌:可以将Django版本降级到3.2.18或更早的版本,以继续使用MySQL 5.5‌2。
    ‌升级MySQL版本‌:将MySQL升级到8.0或更高版本,以兼容Django 4.2‌2
Django3.2版本与mysql5.5版本不兼容问题:
解决方式一:降低Django版本
解决方式二:升级Mysql版本
解决方式三:在settings.py文件追加兼容性配置
# 设置兼容
from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime'

第六步:在views.py文件中开发业务逻辑模块

from django.shortcuts import render,redirect
from app.models import User
# Create your views here.
​
def login(request):
    # print("访问到了登录函数")
    return render(request,"login.html")
​
def login_action(request):
    print("登录动作")
    # 接收界面参数
    username = request.POST.get("username")
    password = request.POST.get("password")
​
    if User.objects.filter(username=username,password=password):
        #登录成功
        return redirect("/main/")
    else:
        return render(request, "login.html",{"msg":"用户名或密码错误!"})
​
def main(request):
    return render(request, "main.html")

第七步:在url.py文件中导入views.py文件

from django.urls import path
from app import views
urlpatterns = [
    path("login/", views.login),
    path("login_action/", views.login_action),
    path("main/", views.main),
]

八.request请求

"""
    get方式:
        01:刷新浏览器地址栏
        02:a链接 href属性
        03:window.location.href
        04:form表单中,method="GET"
        05:ajax请求中,type:"GET"
    post方式:
        01:form表单中,method="POST"
        02:ajax请求中,type:"POST"
"""
def requestTest(request):
    # print(request)
    # print(type(request))
    # print(request.method) # 得到请求方法   GET  POST   PUT  DELETE
    # print(request.GET.get("id")) # 接收前台参数
    # print(request.FILES.get("filename"))  # 接收前台文件
    # 了解
    # print(request.path)  # 获取请求路由
    # print(request.path_info)  # 获取请求路由
    # print(request.encoding) # 编码
    # print(request.scheme)  # 请求协议
    # print(request.body)  # 请求体
    # print(request.get_port())  # 8000
    # print(request.get_host())  #localhost:8000
    # print(request.is_ajax()) # 当次请求是否是ajax
    return HttpResponse("lufei,海贼王,21")

九.response响应

"""
    01:转发render或重定向redirect
    02:直接通过HttpResponse响应普通字符串
    03:在02响应的基础之上,如果字符串有特殊格式(JSON格式),那么响应回去的数据可以做特殊处理
        响应JSON格式字符串
            方式一:手动拼接
            方式二:通过json模块将字典转换为json格式字符串 (需要导入: import json)
            方式三:通过JsonResponse  (需要导入:from django.http import JsonResponse)
"""
import json
from django.http import JsonResponse
def responseTest(request):
    #name = "{\"username\":\"lufei\",\"title\":\"海贼王\",\"age\":21}"
    name = {"username":"张三","password":"123456","address":"太原"}
    # return HttpResponse(json.dumps(name))
    return JsonResponse(name)

十.orm模型查询(M)

各种查询方式

方式一:Django中自带的admin界面

在admin.py文件中注册模型数据

admin.site.register(models.User)

通过命令追加admin界面的登录信息

python manage.py createsuperuser

访问admin界面,查看是否有模型数据

方式二:通过pycharm自带的Django控制台

方式三:通过配置在任意的python文件中做测试

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
    import django
    django.setup()
    from app.models import User
    user = User.objects.get(id=1)
    print(user.username)

ORM中查询机制

如果控制台需要显示sql语句,需要在setting.py文件中配置日志信息

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
        'level':'DEBUG',
        'class':'logging.StreamHandler',
        },
    },

    'loggers': {
    'django.db.backends': {
        'handlers': ['console'],
        'propagate': True,
        'level':'DEBUG',
        },
    }
}

单表查询

01.查询所有

userlist = User.objects.all() print(userlist)

02.通过主键或其他字段查询

得到的结果是唯一的对象 {{user.username}}

要求get查询得到的结果必须是唯一的

如果数据 不存在 或 查询的结果比较多,那么会报错 get() returned more than one User -- it returned 2!

user = User.objects.get(username="乔巴43324") print(user)

03.通过filter查询

得到的结果是集合 {% for user in userlist %} {{user.username}}

如果数据不存在,则返回空集合

user = User.objects.filter(username="路飞123") print(user)

04.通过values 当前台界面需要指定字段时使用 json格式 {key:value,key:value}

userlist = User.objects.all().values("id","username") print(userlist)

05.通过values_list 当前台界面需要指定字段时使用 得到得只有值,[(1, '路飞123'), (2, '乔巴'), (3, '乔巴')]

userlist = User.objects.all().values_list("id", "username") print(userlist)

06.exclude(参数) 查询除了满足条件的所有数据

userlist = User.objects.exclude(id=2) print(userlist)

07 .order_by(参数) 默认升序

.order_by(-参数) 降序

.order_by(参数1,参数2) 如果默认按照参数1升序,如果参数1一样,那么按照参数2升序

userlist = User.objects.order_by("sal","-id") print(userlist)

08 .reverse() 反序输出

userlist = User.objects.order_by("-id").reverse() print(userlist)

09 .count 统计

userlist = User.objects.all().count() print(userlist)

10 .first()或者.last() 查询列表中的第一条或最后一条,得到是对象

userlist = User.objects.all().last() print(userlist)

11 .exists() 查询数据是否存在,返回boolean类型

userlist = User.objects.filter(id=2).exists() print(userlist)

单表下划线查询

属性__gt > 大于

属性__gte >= 大于等于

属性__lt < 小于

属性__lte

属性__gt=1,属性__lt=5 select * from t_user where id > 1 and id < 5

属性__range=[1,3] id>=1 and id

属性__in=[1,3] select * from t_user where id = 1 or id = 3

属性__contains 模糊匹配 like %路% 匹配英文区分大小写

属性__icontains 模糊匹配 like %路% 匹配英文不区分大小写

属性__startswith="路" 模糊匹配 like 路%

属性__endswith="路" 模糊匹配 like %路

userlist = User.objects.filter(id__gt=1,id__lte=3)
userlist = User.objects.filter(id__range=[1,3])
userlist = User.objects.filter(id__in=[1,3])
userlist = User.objects.filter(username__contains="LU")
print(userlist)

orm_F和Q查询

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
    import django
    django.setup()
    from app.models import Book, Press, BookType
    from django.db.models import F,Q
    #select * from app_book where sale > kucun
    #booklist = Book.objects.filter(sale__gte=F("kucun"))
    #print(booklist)
    #id 1,3   range   in
    bookes = Book.objects.filter(Q(id__gte=3) | Q(id__lte=1))
    print(bookes)vvv

聚合查询

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
    import django
    django.setup()
    from app.models import Book, Press, BookType
    from django.db.models import F,Q,Max,Min,Sum,Count,Avg
    #查询图书中价格的最大值和最小值
    # books = Book.objects.aggregate(Avg("bookprice"),Min("bookprice"))
    # print(books)
    # 分组 (默认分组)
    # books = Book.objects.annotate(Count("bookprice"))
    # print(books)
    result = Book.objects.values("press_id").annotate(num = Count("id")).values("press_id","num")
    print(result)

一对多查询

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
    import django
    django.setup()
    from app.models import Book, Press, BookType

1.从 多方 查找 一方

book = Book.objects.get(id=2)
print(book)
print(book.press.pressname)

2.从 一方 查找 多方 (查询id为1的出版社对应的所有图书)

booklist = Book.objects.filter(press_id=1)
print(booklist)

presslist = Press.objects.get(pressname="清华大学出版社").id
print(presslist)

3.从 一方 查找 多方 (查询清华大学出版社对应的所有图书) 发送2条sql语句

#select * from app_book where press_id = (select id from app_press where pressname = "清华大学出版社")
booklist = Book.objects.filter(press_id=Press.objects.get(pressname__contains="人民").id)
print(booklist)

4.从 一方 查找 多方 (查询清华大学出版社对应的所有图书) 发送1条sql语句

在外键字段上追加双下划线代表 跨表联查

booklist = Book.objects.filter(press__pressname__contains="清华")
print(booklist)

5.图书名称 出版社名称 .values("自己的字段“,"外键字段__名称")

booklist = Book.objects.all().values("bookname","press__pressname") 
print(booklist)

6.反向查询 (从一方作为发起者查询多方数据)

方式一: 一方对象名称.多方类名小写_set.all() 发送多条sql

方式二: 在外键配置的属性中,追加关联字段

press = models.ForeignKey(to="Press",related_name="books",
press = Press.objects.get(pressname="清华大学出版社")
print(press)
print(press.book_set.all())
press = Press.objects.get(books__bookname="鹿鼎记")
print(press)

多对多查询

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM20250807.settings")
    import django
    django.setup()
    from app.models import Book, Press, BookType
    #booktype = BookType.objects.get(id=1)
    #print(booktype)
    # 设置多对多关系
    #booktype.books.set([1,2,3])
    # 通过图书类型查找图书
    # booktype = BookType.objects.get(id=1)
    # print(booktype.books.all())
    # 通过图书查找图书类型
    # 方式一
    # 方式二
    # book = Book.objects.get(id=2)
    # print(book.booktype_set.all())
    book = Book.objects.filter(booktypes__id=1)
    print(book)

十一.反射

反射:
    getattr()   setattr()  hasattr()  delattr()
    01:操作类属性和类方法、静态方法
        获取属性:getattr(类名,"属性名称字符串")
        设置属性:setattr(类名,"属性名称字符串",需要设置的新的值)
        获取方法:getattr(类名,"方法名称字符串")
        执行方法:getattr(类名,"方法名称字符串")()
    02:操作对象属性和对象方法
        获取属性:getattr(对象名称,"属性名称字符串")
        执行方法:getattr(对象名称,"方法名称字符串")(参数)
    03:操作第三方模块
        执行方法:getattr(模块名称,"方法名称字符串")(参数)
    04:自己的模块
        执行方法:getattr(sys.modules["__main__"],"方法名称字符串")(参数)

十二.Session和Cookie

登录:认证与授权

到此这篇关于Python-Django框架基础的文章就介绍到这了,更多相关Python Django框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文