Django
- [Django 简介](#Django 简介)
- URL组成部分详解
- 第一个Django项目
- URL与视图函数的映射
- URL的两种传参方式
- path函数
Django 简介
-
Django 是一个高级的 Python Web 框架,用于快速开发可维护和可扩展的 Web 应用程序。使用 Django,只要很少的代码,就可以轻松地完成一个正式网站所需要的大部分内容
-
Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式
-
- 模型(Model): 编写程序应有的功能,负责业务对象与数据库的映射(ORM)
-
- 视图(View): 图形界面,负责与用户的交互(页面)
-
- 控制器(Controller): 负责转发请求,对请求进行处理
- 控制器(Controller): 负责转发请求,对请求进行处理
-
特点:
-
- ORM(对象关系映射): Django 提供了一个强大的 ORM,允许开发者通过 Python 代码来定义和操作数据库模型,而无需直接使用 SQL。这使得数据库操作更加抽象和易于管理。
-
- MVC 架构: Django 遵循 MVC(模型-视图-控制器)的软件设计模式。在 Django 中,模型(Model)表示数据结构,视图(View)负责呈现用户界面,而控制器(Controller)的职责被称为视图(View)。
-
- 模板引擎: Django 使用模板引擎来生成 HTML,这使得前端和后端的代码分离更加容易。Django 的模板语言允许开发者在模板中嵌入动态内容。
-
- 自动化 admin 界面: Django 自动生成管理后台,使得管理和操作数据库的过程变得非常简单。开发者可以轻松地创建、修改和删除数据库记录,而无需编写自定义的管理界面。
URL组成部分详解
URL是uniform Resource Locator的简写,统一资源定位符
一个URL由以下几部分组成:
- scheme:代表的是访问的协议,一般为http或https以及ftp等
- host:主机名,域名,比如www.baidu.com
- port:端口号,http协议是80端口,https协议是443端口
- path:查找路径。比如:www.baidu.com/trending/now,后面的trending/now就是path
- query-string:查询字符串,用来传参。比如:www.baidu.com/s?wd=python&a=1,后面的wd=python和a=1就是查询字符串
- anchor:锚点,后台一般不用管。前端用来做页面定位
第一个Django项目
创建一个Django项目
- 一,用命令行的方式创建
-
- 1.打开想要存放想要存放Django项目的文件夹
-
- 2.在文件地址栏输入cmd,按回车键就可以在当前路径打开cmd命令窗口
- 2.在文件地址栏输入cmd,按回车键就可以在当前路径打开cmd命令窗口
-
- 3.在命令行中输入django-admin startproject startdjango
- 3.在命令行中输入django-admin startproject startdjango
-
- 4.创建成功
- 4.创建成功
- 二、用pycharm的方式:
-
- 点击新建项目,选择Django,如图
- 点击新建项目,选择Django,如图
运行Django项目
- 一、通过命令行的方式:
-
- 1.进入创建好的Django文件夹中,在地址栏输入cmd进入命令提示符
-
- 2.在命令提示符中输入 python manage.py runserver
- 2.在命令提示符中输入 python manage.py runserver
-
- 3.在网页中输入http://127.0.0.1:8000/,显示下图即创建成功
- 3.在网页中输入http://127.0.0.1:8000/,显示下图即创建成功
- 二、通过Pycharm来运行
-
- 1.进入urls.py中,点击运行
-
- 2.点击运行框中的的地址
- 2.点击运行框中的的地址
项目结构介绍
- 1.manage.py:以后和项目交互基本上都是基于这个文件。一般情况下不编辑这个文件
-
- 交互方法:在终端输入python.manage.py [子命令];如:可以输入python.manage.py help 看下能做什么事情
- 2.setting.py:本项目的设置项,以后所有和项目相关的配置都是放在这个里面
- 3.urls.py:这个文件是用来配置URL路由的。比如访问http://127.0.0.1/news/是访问新闻列表页,这些东西就需要在这个文件中完成
- 4.wsgi.py:项目与WSGI协议兼容的web服务器入口,部署的时候需要用到的,一般情况下也是不需要修改的
project和app的关系
- app是django项目的组成部分,一个app代表项目的一个模块,所有URL请求的响应都是由app来处理。
比如豆瓣,里面由图书、电影、音乐等许许多多的模块。如果站在Django的角度来看,图书、电影、音乐这些模块就是app,他们共同组成豆瓣这个项目,因此这里有个概念:Django项目由许多app组成,一个app可以被用到其他项目,django也能拥有不同的app - 创建APP:通过命令 python manage.py startapp book
URL与视图函数的映射
- 1.在urls.py中创建一个index视图函数,返回响应的内容
- 2.在urls.py的urlpatterns列表中添加path,映射到index函数中
- 3.如果setting.py中的DEBUG = True,则urls.py进行修改后,会自动运行urls.py。最终出现如图表示成功
- 4.如果想要添加path。如:添加方法为s,则需要在域名后添加方法s。才可以访问到视图
URL的两种传参方式
在实际开发中,在urls.py中只会做一些映射,不会去写一些视图函数。视图函数通常会写在各个APP的view.py中。
在URL中携带参数
- 1.通过查询字符串(query string):https://www.baidu.com/s?wd=python\&a=1\&b=2
-
- 在APP的views.py中
java
# 1,查询字符串:http://127.0.0.1:8000/book?id=3
def book_detail_query_string(request):
#request.GET = {"id":3}
book_id = request.GET.get('id')
name = request.GET.get('name')
return HttpResponse(f"您查找的图书id是:{book_id},图书名称是:{name}")
-
- 在urls.py中
java
urlpatterns = [
#http://127.0.0.1:8000/book?id=1
path('book',views.book_detail_query_string)
]
- 2.在path中携带:http://127.0.0.1:8000/book/2
-
- 在APP的views.py中
java
# 2.在path中携带:http://127.0.0.1:8000/book/1
def book_detail_path(request,book_id):
return HttpResponse(f"您查找的图书id是:{book_id}")
-
- 在urls.py中
java
urlpatterns = [
#http://127.0.0.1:8000/book/1
#在book_id前指定参数类型有两点好处:
#1,以后在浏览器中,如果book_id输入的是一个非整形,那么会出现404错误
#2,在视图函数中,得到的book_id就是一个整形,否则默认是str类型
path('book/<int:book_id>',views.book_detail_path)
]
path函数
path函数定义为:path(route,view,name=None,kwargs=None)。以下对这几个参数进行详解
- 1,route参数:url的匹配规则。这个参数可以指定url中需要传递的参数,比如在访问文章详情页时,可以传递一个id。传递参数是通过<>尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的id都是int类型,可以写为int:id那么以后匹配时,就只会匹配到id为int类型的url,而不会匹配其他的url。并且在视图函数中获取这个参数的时候,就已经被转换成一个int类型了。其他几种常用类型:
-
- str:非空的字符串类型。默认的转换器,但是不能包含斜杠
-
- int:匹配任意的零或正数的整形。到视图函数中就是一个int类型
-
- slug:由英文中的斜杠 - ,或者下划线_连接英文字符或者数字而成的字符串
-
- uuid:匹配uuid字符串
-
- path:匹配非空的英文字符串,可以包括斜杠/
-
-
- 示例代码:
-
-
-
- 视图函数:
-
java
def book_int(request,book_id):
return HttpResponse(f"您查找的图书id是:{book_id}")
def book_str(request,book_id):
return HttpResponse(f"您查找的图书id是:{book_id}")
def book_slug(request,book_id):
return HttpResponse(f"您查找的图书id是:{book_id}")
def book_path(request,book_id):
return HttpResponse(f"您查找的图书id是:{book_id}")
-
-
- path函数:
-
java
urlpatterns = [
path('admin/', admin.site.urls),
# path('s', index),#https://127.0.0.1:8000/s
#http://127.0.0.1:8000/book/1
#在book_id前指定参数类型有两点好处:
#1,以后在浏览器中,如果book_id输入的是一个非整形,那么会出现404错误
#2,在视图函数中,得到的book_id就是一个整形,否则默认是str类型
path('book/<int:book_id>',views.book_int),
path('book/str/<str:book_id>',views.book_str),
path('book/slug/<slug:book_id>',views.book_slug),
path('book/path/<path:book_id>',views.book_path)
]
- 2,view参数:可以为一个视图函数或者是类视图.as_view或者是django.urls.include()函数的返回值
- 3,name参数:这个参数是给这个url取个名字,这在项目比较大,url比较多的时候用处很大
url路由模块化
- 1,在对应APP的views.py中创建视图函数
java
from django.shortcuts import render,HttpResponse
def movie_list(request):
return HttpResponse("电影列表")
def movie_detail(request,movie_id):
return HttpResponse(f"您获取的电影ID是:{movie_id}")
- 2,在对应APP下面创建urls.py文件,将视图函数传入相应的模块下
java
from django.urls import path
from movie import views
# 指定应用名称(应用命名空间)
app_name = 'movie'
urlpatterns = [
path('list', views.movie_list, name='movie_list'),
path('detail/<int:movie_id>', views.movie_detail, name='movie_detail'),
]
- 3,回到主项目的urls.py中,导入include函数,传入相应app下的urls
java
from django.contrib import admin
from django.urls import path,include
from django.shortcuts import HttpResponse
urlpatterns = [
path('admin/', admin.site.urls),
path('movie/',include('movie.urls'))
]
url反转
- 之前我们都是通过url来访问视图函数,如果我们想要反向知道这个视图函数,那么可以通过reverse反转回他的url来实现:
java
path('book',views.book_detail_query_string,name="book_detail_query_string")
>/book
- 如果有应用命名空间或者有实例命名空间,那么应该在反转的时候加上命名空间:
java
print(reverse("movie:movie_list"))
>/movie/list
- 如果这个url中需要传递参数,那么可以通过kwargs来传递参数:
java
print(reverse("book_str",kwargs={"book_id":1}))
>/book/str/1
- 如果是查询字符串的方式传参,那么就只能通过字符串拼接的方式
java
print(reverse("book_detail_query_string")+"?id=1")
>/book?id=1