python 07-Django
(1)Django介绍
Django是一个用Python编写的免费开源Web框架,是Python Web开发中最常用的框架之一,适用于前端和后端Web开发。
特点:
1. 快速开发:Django提供了大量的工具和库,允许开发者在几个小时内完成Web应用程序从概念到启动的过程。
2. MVC/MTV模型:Django遵循MVC(模型-视图-控制器)的软件设计模式,但使用MTV(模型-模板-视图)的术语。其中,Model表示数据结构,Template负责展示页面,View负责业务逻辑。
3. ORM(对象关系映射):Django提供了一个强大的ORM,允许开发者通过Python代码来定义和操作数据库模型,无需直接使用SQL。
4. 模板引擎:Django使用模板引擎来生成HTML,便于前后端的代码分离。
5. 自动化Admin界面:Django自动生成管理后台,简化管理和操作数据库的过程。
6. 表单处理:Django提供了强大的表单处理工具,简化用户输入的验证和处理操作。
7. 安全性:Django内置了一些安全性功能,例如防止常见的Web攻击(如CSRF攻击),并提供了方便的用户身份验证和授权系统。
8. 可扩展性:Django的组件是松耦合的,允许开发者使用现有的组件或编写自己的应用程序来扩展框架功能。
9. 社区支持:Django拥有庞大的社区支持,提供了大量的文档、教程和第三方包,使得学习和使用Django变得更加容易。
(2)使用方法(不全 只是部分)
1.安装Django:
可以通过pip/pipenv命令安装Django
2.创建Django项目:
使用django-admin startproject <项目名>
命令创建Django项目。
- init.py文件:
init.py 文件用于标识当前所在的目录是一个Python包。这意味着Python会将该目录视为一个包含模块(modules)的集合,这些模块可以是 Python 文件。在Django项目中,每个应用(app)都是一个包,故它们都会包含一个 init.py 文件。
- asgi.py文件:
是一个用于配置异步服务器网关接口(ASGI)的入口文件。ASGI 是一种协议,旨在处理Web应用程序,特别是支持异步处理和更高级别的并发。asgi.py文件允许Django项目与ASGI兼容的服务器进行交互,从而支持异步视图和更高效的并发处理。这对于需要处理大量并发请求或实时通信(如WebSocket)的应用程序特别有用。
- settings.py文件
settings.py 文件是 Django 项目的重要配置文件。项目启动时,settings.py 配置文件会被自动调用,而它定义的一些全局为 Django 运行提供参数,在此配置文件中也可以自定义一些变量,用于全局作用域的数据传递。
- urls.py文件
url.py 文件用于记录 Django 项目的 URL 映射关系,它属于项目的基础路由配置文件,路由系统就是在这个文件中完成相应配置的,项目中的动态路径必须先经过该文件匹配,才能实现 Web 站点上资源的访问功能。
- wsgi.py文件
wsgi.py 是 WSGI(Web Server Gateway Interface)服务器程序的入口文件,主要用于启动应用程序。它遵守 WSGI 协议并负责网络通讯部分的实现,只有在项目部署的时候才会用到它。
3.创建应用:
在Django项目中,可以创建多个应用,每个应用完成特定的功能python manage.py startapp <应用名>
migrations:数据迁移包,负责迁移文件,生成数据库表数据。
init.py:初始化文件,标志app可以被引用。
admin.py:后台管理工具,用于管理model和数据库。
apps.py:Django的生成app名称的文件,用于存放该应用的配置信息
models.py:模型文件,包含数据库表的映射。
tests.py:测试文件。
views.py:视图函数文件,用于处理用户的请求并返回响应。
4.定义模型:
在应用的models.py文件中定义数据模型,Django会自动生成数据库表(model就是用python class来表示app的数据)
movies/model.py:
from django.db import models
# Create your models here.
# 电影类型
class Genre(models.Model):
name=models.CharField(max_length=255)
class Movie(models.Model):
title=models.CharField(max_length=255)
release_year=models.IntegerField()
number_in_stock=models.IntegerField()
daily_rate=models.FloatField()
genre=models.ForeignKey(Genre,on_delete=models.CASCADE)
接着打开vidly/settings.py进行配置:
再运行python manage.py makemigrations
命令,生成一个文件movies\migrations\0001_initial.py
继续运行python manage.py migrate
后,django已经为我们创建好了model对应的数据库表
我们还可以修改model
接着仍旧执行python manage.py makemigrations和python manage.py migrate命令,即同步完成了数据库表的修改
注意:migration文件夹用于记录数据库结构的变化,不要删除里面的文件。删除其中的文件可能会导致Django无法追踪数据库的历史变更,从而在执行数据库迁移时出现问题,无法回滚到之前的某个状态。
如果想要查看某一个migration文件时如何传递sql语句的,可以使用命令python manage.py sqlmigrate movies <xxxx>
5.创建视图:
在应用的views.py文件中编写视图函数,处理用户请求并返回响应。并配置URL:在项目的urls.py文件和应用的urls.py文件中定义URL路由,将URL映射到视图函数
使用python manage.py runserver命令启动服务器后,用浏览器访问:
使页面展示出数据库中的数据,修改movies/views.py:
from django.http import HttpResponse
from django.shortcuts import render
from .models import Movie
def index(request):
# SELECT * From movie
movies = Movie.objects.all()
output = ','.join([m.title for m in movies])
return HttpResponse(output)
其他数据查询方法:
#SELECT * From movie
Movie.objects.all()
#SELECT * From movie WHERE release_year=1984
Movie.objects.filter(release_year=1984)
#SELECT * FROM movie WHERE release_year = 1984 LIMIT 1;只返回符合条件的第一条记录
Movie.objects.get(release_year=1984)
再访问http://127.0.0.1:8000/movies/
6.定义模板:
在应用的模板目录中创建HTML模板文件,用于展示页面。
在Django中,render 函数用于将给定的模板与给定的上下文数据渲染成一个 HttpResponse 对象,并将其返回给客户端。当你调用 render(request, 'index.html', {"movies": movies}) 时,你实际上是在做以下几件事情:
指定一个请求对象 request,它包含了客户端发来的所有请求信息。
指定一个模板名称 'index.html',这是你想要渲染的HTML模板文件。
传递一个上下文字典 {"movies": movies} 给模板,这个字典包含了模板中需要使用的变量。
movies/views.py:
from django.http import HttpResponse
from django.shortcuts import render
from .models import Movie
def index(request):
# SELECT * From movie
movies = Movie.objects.all()
# html模板将能够访问一个名为movies的变量
return render(request, 'index.html', {"movies": movies})
接着创建一个html模板index.html:
快速得到html代码模板:
编写该html文件:
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Genre</th>
<th>Stock</th>
<th>Daily Rate</th>
</tr>
</thead>
<tbody>
{% for movie in movies %}
<tr>
<th>{{movie.title}}</th>
<th>{{movie.genre}}</th>
<th>{{movie.number_in_stock}}</th>
<th>{{movie.daily_rate}}</th>
</tr>
{% endfor %}
</tbody>
</table>
运行后,类型显示错误
原因:Movie模型的genre通过外键(ForeignKey)相关联,那么当访问movie.genre时,实际上是返回一个Genre模型的实例,而不是一个简单的字符串或数值,因此应该把前端的movie.genre改成movie.genre.name
修改templates/index.html:
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Genre</th>
<th>Stock</th>
<th>Daily Rate</th>
</tr>
</thead>
<tbody>
{% for movie in movies %}
<tr>
<th>{{movie.title}}</th>
<th>{{movie.genre.name}}</th>
<th>{{movie.number_in_stock}}</th>
<th>{{movie.daily_rate}}</th>
</tr>
{% endfor %}
</tbody>
</table>
重新运行后,正确了:
上述问题还有一种方法就是:在Genre的model中返回为字符串类型 而不是默认的Genre模型的类型
7.启动和停止服务器:
使用python manage.py runserver
命令启动开发服务器(以ctrl+c
停止服务器)
8.pylint误报一些error
原因是:Pylint版本和配置问题,使得pylint对Django的实体等不太熟悉导致报错。
运行命令pipenv install pylint-django
pylint_django 是一个 Pylint 插件,用于增强对 Django 项目的支持
接着创建一个.pylintrc文件,这是一个pylint配置文件:
9.admin相关功能
- 注册model到管理员界面
运行服务器,访问admin页面,我们可以看到admin的页面Django已经帮我们编写好的
创建一个super用户:
登录后的界面:
movies/admin.py:
from django.contrib import admin
from .models import Genre, Movie
# Register your models in the administration interface
admin.site.register(Genre)
admin.site.register(Movie)
- 定制管理员界面
原来:
movies/admin.py:
再运行就有了id和name:
同理:
再运行:
参考链接:https://www.bilibili.com/video/BV1ng4y1i7Uk?p=12&vd_source=7ad39ca7883055fbebc4eb48b33018a3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了