第1个Django应用及Django的请求处理

news2025/1/19 16:23:05

Python学习之路系列文章目录



  1. python面向对象之警察与匪徒火拼场景模拟
  2. python面向对像之第二次笔记
  3. Django环境搭建及测试
  4. 第1个Django应用及Django的请求处理

---

第1个Django应用及Django的请求处理

  • Python学习之路系列文章目录
  • 一、PyCharm创建django项目
  • 二、创建app
    • 什么是app
    • 怎么创建app
    • 补充:
  • 三、django如何处理请求?<br><br>
  • 四、基本的路由配置
    • 1. 这是最简单的一级路由:
    • 2. 这是二级路由:
    • 3. 使用参数的路由
  • 五、path转化器
  • 六、path方法
  • 总结

---

一、PyCharm创建django项目

  1. 打开软件并选择新建项目

注意:更多设置里面那个模板文件夹清空,标准的项目不包含那个文件夹

在这里插入图片描述

点击创建就成功了

在这里插入图片描述

manage文件主要是用于项目管理,启动项目,创建app,数据管理(不要乱动这个文件)
settings.py 是项目配置文件
urls.py 是配置路由的地方
wsgi.py 同步接受网络请求(不要乱动这个文件)
asgi.py 异步接受网络请求(不要乱动这个文件)

二、创建app

什么是app


在 Django 项目中,一个 “app”(应用)是指一个具有特定功能的独立模块。每个 Django 项目都由一个或多个应用组成,每个应用都负责处理特定的功能或业务逻辑。

一个 Django 应用通常包含以下内容:

  1. 模型(Models):定义数据结构和数据库表格的方式。
  2. 视图(Views):处理用户请求,与模型交互并返回响应。
  3. 模板(Templates):定义呈现给用户的页面内容。
  4. URL 配置(URLs):指定处理不同 URL 请求的视图函数。
  5. 静态文件(Static files):如图片、CSS 文件、JavaScript 文件等。
  6. 管理命令(Management commands):自定义的 Django 命令,可用于执行各种任务。

通过将功能划分为多个应用,可以使 Django 项目更加模块化、易于维护和扩展。每个应用都可以独立开发、测试和部署,同时还可以在不同的项目中重复使用。

怎么创建app

  1. 点击create app (也可以直接点下面的终端输入 startapp <app名称>

如图所示:

在这里插入图片描述

  1. 然后去setting.py文件下看是否注册好了,如果没加上就手动添上。

在这里插入图片描述

  1. 接下来在 urls.py 中配置路由规则(也就是确定请求的URL应该由哪个视图函数来处理)

在这里插入图片描述

  1. 配置好路由后就得去写对应的 view 视图(页面)了

    打开之前创建的app 找到 views.py 文件

    这个 index 就是之前配置路由指定运行的函数

在这里插入图片描述

  1. 最后点击运行即可在浏览器看效果了

在这里插入图片描述

------

补充:

命令行启动:


PS E:\02code\PycharmProjects\djangoTest> python manage.py runserver


三、django如何处理请求?

Django的请求处理流程通常如下:

  1. URL 配置:首先,Django会根据项目中的URL配置确定哪个视图函数或类应该处理请求。URL配置通常在项目的 urls.py 文件中定义。
    决定好要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但是如果传入的 HttpRequest 对象具有 urlconf 属性(由中间件设置) ,则其值将被用于代替 ROOT_URLCONF 设置。也就是说你可以自定义项目入口url是哪个文件!
    接着加载该模块并寻找可用的 urlpatterns ,它是 django.urls.path() 或者 django.urls.re_path() 实例的一个列表,依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说, url 匹配是从上往下的短路操作,所以 url 在列表中的位置非常关键。
  2. 视图函数或类:一旦Django确定了应该处理请求的视图函数或类,它会调用该视图来处理请求。视图函数或类接收请求对象作为参数,并返回一个HTTP响应对象。
    • 函数视图:如果使用函数视图,那么这个视图就是一个简单的Python函数,它接收请求对象作为参数,并返回一个HTTP响应对象。
    • 类视图:如果使用类视图,那么这个视图就是一个继承自Django提供的视图类的Python类,通常至少包含一个dispatch()方法来处理不同类型的请求(GET、POST等),并且每个HTTP请求方法通常都有对应的方法(例如get()、post())来处理相应的请求类型。
  3. 处理请求:在视图函数或类中,你可以编写逻辑来处理请求。这可能包括从数据库中检索数据、处理表单数据、渲染模板等操作。
  4. 返回响应:最后,视图函数或类应该返回一个HTTP响应对象。这个响应对象可以是HTML内容、JSON数据、重定向等,具体取决于应用程序的需求和视图的目的。

    如果匹配的表达式返回了未命名的组,那么匹配的内容将作为位置参数提供给视图。
    关键字参数由表达式匹配的命名组组成,但是可以被 django.urls.pathO 的可选参数 kwargs 覆盖。
    如果没有匹配到任何表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。(比如403,比如无任何反应)

举个例子:

假设我们有一个简单的博客应用,用户可以访问博客首页查看所有的文章列表。当用户访问网站的首页时,Django将处理该请求并返回包含所有文章的页面。

首先,我们需要定义一个URL配置,告诉Django当用户访问首页时应该调用哪个视图来处理请求。

# 项目的urls.py文件

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

然后,我们需要编写一个视图函数来处理首页的请求。我们可以在应用程序的views.py文件中定义这个视图函数。

# 应用程序的views.py文件

from django.shortcuts import render
from .models import Post

def index(request):
    # 从数据库中获取所有文章
    posts = Post.objects.all()
    # 渲染模板并将文章传递给模板
    return render(request, 'blog/index.html', {'posts': posts})

在这个例子中,index视图函数接收一个 request 参数,代表用户发出的请求。该函数从数据库中获取所有文章,并将它们传递给名为 index.html 的模板进行渲染。最后,它返回一个HTTP响应对象,其中包含渲染后的页面内容。

最后,我们需要创建一个模板来显示所有的文章。我们可以在应用程序的templates/blog目录下创建一个名为index.html的模板文件。

<!-- 应用程序的templates/blog/index.html文件 -->

<!DOCTYPE html>
<html>
<head>
    <title>博客首页</title>
</head>
<body>
    <h1>欢迎来到我的博客</h1>
    <ul>
        {% for post in posts %}
            <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</body>
</html>

现在,当用户访问网站的首页时,Django将按照上述流程处理请求,从数据库中获取所有文章,并将它们渲染到名为index.html的模板中,最终返回给用户一个包含所有文章列表的页面。

四、基本的路由配置

假设我们有一个名为myapp的应用程序,并且我们想要定义一些简单的路由来处理用户的请求。

首先,我们需要在项目的主URL配置文件中(通常是urls.py)定义主路由。然后,我们可以在应用程序的URL配置文件中定义应用程序特定的子路由。

1. 这是最简单的一级路由:

urlpatterns 是个列表,每个元素都是 path() 或 re_path() 的实例

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index)
]

2. 这是二级路由:

myapp应用程序的URL配置包含到主URL配置中,并指定了一个前缀myapp/,这意味着当用户访问以/myapp/开头的URL时,Django将会交给myapp应用程序处理。

# 项目的urls.py文件

from django.contrib import admin
from django.urls import path, include  # 导入include函数用于包含应用程序的URL配置

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),  # 包含myapp应用程序的URL配置
]

也就是说访问这个路由时,不会直接调用指定的函数,而是使用include()把第二级路由交给myapp的urls去配置。

# myapp应用程序的urls.py文件

from django.urls import path
from . import views  # 导入应用程序的视图模块

urlpatterns = [
    path('', views.index, name='index'),  # 定义一个空路由,指向index视图函数
    path('about/', views.about, name='about'),  # 定义一个路由,指向about视图函数
]

3. 使用参数的路由

参数部分使用尖括号,可以指定参数类型,很像键值对的形式(类型:参数)

from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

匹配的时候从上到下依次匹配,成功了则终止继续匹配。
例如:

  • /articles/2005/03/ 将匹配第三条,并调用 views.month_archive(request, year=2005,month=3)
  • /articles/2003/ 匹配第一条,并调用 views.special_case_2003(request)
  • /articles/2003 一条都匹配不上,因为它最后少了一个斜杠,而列表中的所有模式中都以斜杠结尾;
  • /articles/2003/03/building-a-django-site/ 将匹配最后一个,并调用views.article_detail(request, year=2003, month=3, slug="building-a-django-site"

五、path转化器

Django 中,路径转换器(path converter)是一种机制,用于将URL中的特定部分提取为视图函数的参数。路径转换器允许你指定 URL 中的某个部分的格式或类型,并将其传递给相应的视图函数。

以下是一些常用的路径转换器及其作用:

  1. <int:name> : 将URL中的部分作为整数参数传递给视图函数。

    path('post/<int:post_id>/', views.post_detail, name='post_detail')
    

    这个路径转换器用于捕获整数类型的值,例如 post/123/ ,其中的 123 将作为整数参数 post_id 传递给视图函数。

  2. <str:name> : 将URL中的部分作为字符串参数传递给视图函数。

    path('category/<str:category_name>/', views.category_detail, name='category_detail')
    

    这个路径转换器用于捕获字符串类型的值,例如 category/technology/ ,其中的 technology 将作为字符串参数 category_name 传递给视图函数。

  3. <slug:name> : 将URL中的部分作为slug参数(通常是一个短标签,包含小写字母、数字、下划线和连字符)传递给视图函数。

    path('article/<slug:article_slug>/', views.article_detail, name='article_detail')
    

    这个路径转换器用于捕获slug类型的值,例如 article/my-first-post/ ,其中的 my-first-post 将作为 slug 参数 article_slug 传递给视图函数。

  4. <uuid:name> : 将URL中的部分作为UUID参数(通常是全局唯一标识符)传递给视图函数。

    path('user/<uuid:user_id>/', views.user_profile, name='user_profile')
    

    这个路径转换器用于捕获UUID类型的值,例如 user/123e4567-e89b-12d3-a456-426614174000/ ,其中的 123e4567-e89b-12d3-a456-426614174000 将作为UUID参数 user_id 传递给视图函数。

  5. <path:name> : 将URL中的部分作为路径参数传递给视图函数。这个转换器用于捕获包含斜杠(/)的路径,允许你捕获包括斜杠在内的任何字符。

    path('file/<path:file_path>/', views.file_detail, name='file_detail')
    

    这个路径转换器用于捕获路径类型的值,例如 file/documents/report.pdf ,其中的 documents/report.pdf 将作为路径参数file_path传递给视图函数。

  6. <date:name>: 将URL中的部分作为日期参数传递给视图函数。这个转换器用于捕获日期类型的值,可以指定日期的格式。

    path('event/<date:event_date>/', views.event_detail, name='event_detail')
    

    这个路径转换器用于捕获日期类型的值,例如event/2024-04-05/,其中的2024-04-05将作为日期参数event_date传递给视图函数。

  7. <path to converter:parameter>: 这个转换器允许你自定义路径转换器。你可以创建自己的转换器,并在URL模式中使用它们。

    path('custom/<custom_converter:custom_param>/', views.custom_view, name='custom_view')
    

    这个路径转换器用于捕获自定义转换器类型的值,例如custom/value/,其中的value将作为自定义参数custom_param传递给视图函数。

六、path方法


path 方法是 Django 中定义 URL 路由的一种常用方式。它通常用于在 Django 项目中的 urls.py 文件中定义 URL 模式。path 方法的基本语法如下:

path(route, view, kwargs=None, name=None)

其中:

  • route 是一个字符串,表示 URL 的模式匹配规则,可以包含路径转换器和常量部分,并且可以通过命名来标识和引用。

    当使用 route 作为 path 方法中的第一个参数时,有一些注意事项需要考虑:

    1. 斜杠结尾

    如果 route 以斜杠结尾(例如 'articles/'),则请求该 URL 时,末尾有无斜杠都会被匹配。例如,/articles//articles 都会匹配到 'articles/' 这个路由。因此,在设计 route 时需要根据实际情况确定是否以斜杠结尾。

    1. 常量部分和路径转换器的顺序
      route 中定义常量部分和路径转换器时,它们的顺序很重要。Django 会按照 route 中的顺序进行匹配,因此应该根据需要将常量部分和路径转换器按照正确的顺序放置,以确保正确的匹配。

    2. 路径转换器的选择
      使用正确的路径转换器非常重要。选择与实际需要相符合的转换器可以帮助 Django 捕获和处理 URL 中的动态部分。例如,如果需要匹配一个整数参数,应该使用 int 转换器;如果需要匹配一个包含任意字符的路径段,应该使用 path 转换器。

    3. 命名路由的唯一性
      如果为 route 分配了一个名称,确保该名称在整个 Django 项目中是唯一的。这样可以避免在进行 URL 反向解析时出现混淆或错误。

    4. 路由冲突
      当定义多个 URL 模式时,要注意避免路由冲突。如果有两个或多个 URL 模式具有相似的 route,可能会导致不确定的匹配行为或错误的路由解析。

    5. 使用命名路由进行 URL 反向解析
      如果需要在视图函数、模板或其他地方生成特定路由的 URL,最好使用命名路由进行 URL 反向解析,而不是硬编码 URL。这样可以提高代码的可维护性,并降低修改 URL 结构时的风险。

  • view 是一个视图函数或者视图类的引用,用于处理匹配到的 URL 请求。

  • kwargs 是一个字典,包含额外的关键字参数,传递给视图函数。

  • name 是一个可选的命名参数,用于为 URL 模式命名,使得在 Django 项目中的其他地方可以引用这个 URL 模式。

例如,下面是一个简单的 path 方法的示例:

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.say_hello, name='hello'),
]

在这个示例中,path 方法定义了一个 URL 模式 hello/,当用户访问这个 URL 时,将会调用名为 say_hello 的视图函数来处理请求。这个 URL 模式也被命名为 'hello',以便在其他地方引用它。

通过使用 path 方法,你可以方便地定义 Django 项目中的 URL 路由,并将请求映射到相应的视图函数或视图类进行处理。

------

总结

这个人很懒,不愿意写总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python环境搭建—安装PyCharm开发工具

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;本文已收录于Python系列专栏&#xff1a; 零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书合…

RTPS协议概述

一.RTPS协议概述 RTPS协议主要由四个部分组成&#xff1a; 1.发现模块&#xff08;Discovery&#xff09; ​ 发现模块是定义了RTPS的参与者&#xff08;Participant&#xff09;获取其他RTPS的参与者&#xff08;Participant&#xff09;&#xff0c;端点&#xff08;Endpo…

前端与后端协同:实现Excel导入导出功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

docker搭建EFK(未完待续)

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败&#xff0c;提示目录挂载失败&#xff0c;可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

C++(13): 智能指针shared_ptr

1. 概述 shared_ptr智能指针&#xff0c;本质是“离开作用域会自动调整(减小)引用计数&#xff0c;如果引用计数为0&#xff0c;则会调用析构函数”。这样一来&#xff0c;就进化成类似于int、float等的一种会被自动释放的类型。 2. 初始化智能指针 初始化一个智能指针的方式比…

LoRa自组网络设计 6

1 深入了解LoRaWan 1.1 LoRaWan概述 LoRaWAN采用星型无线拓扑 End Nodes 节点 Gateway 网关 Network Server 网络服务器 Application Server 应用服务器 LoRa联盟是2015年3月Semtech牵头成立的一个开放的、非盈利的组织&#xff0c;发起成员还有法国Actility&#xff0c;中国…

非关系型数据库-----------探索 Redis高可用 、持久化、性能管理

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

(学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是&#xff1a;Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范&#xff0c;就是接口 监听器的作用是&#xff0c;监听某种变化(一般就是对…

kettle从入门到精通 第五十二课 ETL之kettle Avro output

1、上一节课我们学习了avro input&#xff0c;本节课我们一起学习下avro out步骤。 本节课通过json input 加载json文件&#xff0c;通过avro out 生成avro二进制文件&#xff0c;写日志步骤打印日志。将json input、avro output、写日志三个步骤拖到画布&#xff0c;然后连线…

【蓝桥杯选拔赛真题57】C++字符串反转 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C字符串反转 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C字符串反转 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 给定一个只包含大写字母"M…

速成axios

Axios 大家好,又到了我们学习新东西的时候了,今天我们来了解一下现在市场上最主流的发送ajax请求的插件咯 了解一个插件的第一步肯定是去它的官网逛逛咯 从它的主页就可以看出axios是基于promise异步,适用于浏览器和node.js ajax的前世今生 对于我们来说忘什么都不能忘本呐…

Windows启动项管理器Autoruns

文章目录 AutoRunsVirusTotalAutorunsc AutoRuns AutoRuns用于启动程序管理&#xff0c;可显示系统启动或登录时的各种自动启动行为&#xff0c;并扩展和加载各种系统进程&#xff0c;要比任务管理器中的自启动管理高级得多&#xff0c;其界面如下&#xff0c;列出了所有开机启…

Vue3(学自尚硅谷)

一、基础准备工作 &#xff08;一&#xff09;过程 环境要求&#xff1a;有node.js环境、npm。执行命令&#xff1a; npm create vuelatest 而后选择&#xff1a; ✔ 请输入项目名称&#xff1a; … me_vue3 ✔ 是否使用 TypeScript 语法&#xff1f; … 否 / 是 ✔ 是否启用…

Springboot传参要求

Web.java(这里定义了一个实体类交Web) public class Web{ private int Page; public int getPage() {return Page;}public void setPage(int page) {Page page;} } 1、通过编译器自带的getter、Setter传参 。只是要注意参数的名字是固定的&#xff0c;不能灵活改变。 传参的…

苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro

演示站&#xff1a;http://a.88531.cn:8016 MXPro 模板主题(又名&#xff1a;mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频&#xff0c;不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气&#xff0c;但是比较且可视化功…

51单片机实验02- P0口流水灯实验

目录 一、实验的背景和意义 二、实验目的 三、实验步骤 四、实验仪器 五、实验任务及要求 1&#xff0c;从led4开始右移 1&#xff09;思路 ①起始灯 &#xff08;led4&#xff09; ②右移 2&#xff09;效果 3&#xff09;代码☀ 2&#xff0c;从其他小灯并向右依…

python_3

文章目录 题目运行结果模式A模式B模式C模式D 题目 mode input("请选择模式:") n int(input("请输入数字:"))if mode "A" or mode "a":# 模式A n:输入的层数 i:当前的层数# 每行数字循环次数 ifor i in range(1, n 1):for j in r…

【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

目录 136.只出现一次的数字 118.杨辉三角 26.删除有序数组中的重复项 260.只出现一次的数字 ||| vector的详细介绍及用法这里就不过多赘述了&#xff0c;可以参考上一篇博客&#xff1a;vector的介绍及使用说明 136.只出现一次的数字 题目&#xff1a; 给你一个 非空 整数…

Python--Django--说明

Django 是基于python 的 Web 开发框架. &nsbp;   Web开发指的是开发基于B/S 架构, 通过前后端的配合, 将后台服务器上的数据在浏览器上展现给前台用户的应用. &nsbp;   在早期, 没有Web框架的时候, 使用 Python CGI 脚本显示数据库中的数据. Web框架致力于解决一些…