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项目。‌

  1. init.py文件:
    init.py 文件用于标识当前所在的目录是一个Python包。这意味着Python会将该目录视为一个包含模块(‌modules)‌的集合,‌这些模块可以是 Python 文件。‌在Django项目中,‌每个应用(app)都是一个包,‌故它们都会包含一个 init.py 文件。‌
  1. asgi.py文件:
    是一个用于配置异步服务器网关接口(‌ASGI)‌的入口文件。‌ASGI 是一种协议,‌旨在处理Web应用程序,‌特别是支持异步处理和更高级别的并发。‌asgi.py文件允许Django项目与ASGI兼容的服务器进行交互,‌从而支持异步视图和更高效的并发处理。‌这对于需要处理大量并发请求或实时通信(‌如WebSocket)‌的应用程序特别有用。‌
  1. settings.py文件
    settings.py 文件是 Django 项目的重要配置文件。项目启动时,settings.py 配置文件会被自动调用,而它定义的一些全局为 Django 运行提供参数,在此配置文件中也可以自定义一些变量,用于全局作用域的数据传递。
  1. urls.py文件
    url.py 文件用于记录 Django 项目的 URL 映射关系,它属于项目的基础路由配置文件,路由系统就是在这个文件中完成相应配置的,项目中的动态路径必须先经过该文件匹配,才能实现 Web 站点上资源的访问功能。
  1. 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


posted @   卡卡发  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示