系列文章目录
第一章 python之初识django框架
第一章 python之熟悉django框架
前言
Django是一个使用Python编写的开源Web应用框架,它提供了一套高效、灵活和安全的工具和功能,用于快速开发Web应用程序。以下是一些值得注意的方面:
MVC模式:Django遵循MVC(Model-View-Controller)模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个组件。模型表示应用程序的数据结构和数据库访问逻辑,视图是处理用户请求和生成响应的代码,而控制器处理路由和请求分发。
ORM(对象关系映射):Django提供了强大的ORM功能,使开发者可以使用Python代码而不是SQL语句来操作数据库。通过定义模型类和字段,Django可以自动创建数据库表、执行查询和更新操作,大大简化了与数据库的交互。
URL配置:Django使用URL配置来将请求映射到合适的视图函数。URL配置基于正则表达式,可以通过URL模式匹配来调用相应的视图函数。
视图函数:视图函数是处理用户请求的代码,它接收HTTP请求作为输入,生成HTTP响应作为输出。视图函数可以返回HTML、JSON、XML等格式的响应,还可以进行数据库操作、权限验证等。
模板引擎:Django提供了强大的模板引擎,用于将数据和逻辑与HTML模板分离。模板引擎可以使用变量、循环、条件语句等功能来动态生成HTML内容,使开发者可以更方便地管理和渲染页面。
表单处理:Django提供了丰富的表单处理功能,可以用于验证用户输入、生成表单HTML代码,并处理表单提交的数据。开发者可以使用Django提供的表单类来简化表单处理过程。
用户认证和授权:Django集成了用户认证和授权功能,可以轻松实现用户注册、登录、注销等功能。开发者可以使用Django的内置用户模型和认证系统,也可以自定义用户模型和认证后端。
中间件:Django中间件是一种可重用的组件,用于在请求和响应过程中执行一些通用的功能。中间件可以处理请求、修改响应、处理异常等,是Django中实现全局和应用级别功能的一种机制。
路由和视图装饰器:Django使用路由机制将请求映射到相应的视图函数。可以使用URLconf配置URL路由规则,也可以使用装饰器自定义视图函数的行为。
静态文件处理:Django提供了静态文件处理功能,可以自动处理CSS、JavaScript、图片等静态文件的收集、压缩、缓存等操作。
一、django轻量版
二、 项目目录
分散的app
放在一个apps下
三、基础知识点
- 路由
- 视图
- 模板
- 静态文件和媒体文件
- 中间件 先不管
- ORM(时间) 先不管
流程图
路由
- int,整数
- str,字符串 /
- nid
- slug,字母+数字+下滑线±
- uuid,uuid格式
- path,路径,可以包含 /
1
app01.views
编写视图函数
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def home(request):
return HttpResponse("首页")
def books(request, nid):
print(nid)
page = request.GET.get("page")
return HttpResponse("图书")
def article(request):
nid = request.GET.get("nid")
print(nid)
return HttpResponse("文章详情")
def user(request,xid,yid):
print(xid)
print(yid)
return HttpResponse("用户")
2
crm.urls
编写总路由
from django.urls import path, re_path
from app01 import views
urlpatterns = [
path('home/', views.home),
# books/路径/edit/
path('books/<path:nid>/edit/', views.books),
path('article/', views.article),
# /user/字母或数字-数字/数字/
re_path(r'user/(?P<xid>\w+-\d+)/(?P<yid>\d+)/', views.user),
]
3
激活虚拟环境
建议打开项目就激活虚拟环境
运行程序
python manage.py runserver
4
访问
运行程序后出现的网址
测试绑定路由关系是否返回视图函数对应的返回信息
例如:
路由分发
总共100个功能 = 用户有30个+ 其他有70个,就可以做一个路由分发
inlucde + app(一般),将功能拆分不到不同的app中
这里我们再创建两个,api和web
在每个app里面创建一个urls.py,直接先复制总路由的模板
1
先编写视图函数
web/views.py
>api/views.py
2
编写子路由和总路由
3
访问
依次访问每个路由下是否返回了对应的路由内容
例如:
注意有无斜杠的区别/
手动路由分发
创建一个app02,在里面操作
编写子路由
app02/url.py
编写总路由 加
访问,对比这几种方式,都可以访问到,以后根据需求自己
本质
-
URL对应函数
path('user/add/', views.login),
-
URL对应元组
path('user/add/', (元素,appname元素,namespance元素) ),
path('user/add/', include("apps.api.urls") ), path('user/add/', ([],None,None) ),
name
创建一个app03
在总路由中绑定视图函数
视图函数中反向基于name反向生成
编写html 中反向生成
在app03下创建templates文件夹并创建login.html
namespace
辅助name的
编写api和web总路由
编写api和web子路由
添加这句在子路由中 app_name = “api”
视图函数反向生成
html中反向生成
访问,观察终端的打印信息
name对于权限的应用
游客,具有一些权限。 permissions = [“register”,“login”,‘home’]
登录用户,具有更多权限。 permissions = [“register”,“login”,‘home’,'‘get’,‘logout’]
管理员,具有所有权限。 permissions = [“register”,“login”,‘home’,‘get’,‘delete’,‘update’,‘add’]
视图
单文件 之前就是一个views.py
变成文件夹,view,后续根据不同的业务功能编写多个视图文件
视图参数:
print(request)
print(request.path)
print(request.GET)
print(request.resolver_match)
<WSGIRequest: GET '/app02/login'>
/app02/login
<QueryDict: {}>
ResolverMatch(func=app02.views.login, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[], route=app02/login)
返回值
- HttpResponse
- JsonResponse
- render
- redirect
from django.shortcuts import HttpResponse, redirect, render
from django.http import JsonResponse
def auth(request):
pass
def login(request):
# 1.获取请求数据
print(request)
# 2.根据请求数据进行条件的判断 GET/POST GET.get("xx") POST.get("xx")
# 3.返回数据
# 3.1 字符串/字节/文本数据(图片验证码)
# return HttpResponse("login")
# 3.2 JSON格式(前后端分离、app小程序后端、ajax请求)
# data_dict = {"status": True, 'data': [11, 22, 33]}
# return JsonResponse(data_dict)
# 3.3 重定向
# return redirect("https://www.baidu.com")
# return redirect("http://127.0.0.1:8000/api/auth/")
# return redirect("http://127.0.0.1:8000/api/auth/")
# return redirect("/api/auth/")
# return redirect("/api/auth/") # name
#
# from django.urls import reverse
# url = reverse("auth")
# return redirect(url) # name
# return redirect("auth")
# 3.4 渲染
# - a.找到 'login.html' 并读取的内容,问题:去哪里找?
# - 默认先去settings.TEMPLATES.DIRS指定的路径找。(公共)
# - 按注册顺序每个已注册的app中找他templates目录,去这个目录中寻找'login.html'
# - 一般情况下,原则,那个app中的的模板,去哪个那个app中寻找。
# - b.渲染(替换)得到替换完成的字符串
# - c.返回浏览器
return render(request, 'api/login.html')
响应头
from django.shortcuts import HttpResponse, redirect, render
from django.http import JsonResponse
def login(request):
res = HttpResponse("login")
# 设置值
res['xx'] = "xx"
res['name'] = "蜡笔小新"
res['xxx'] = "2rfafsggegq"
#设置值
res.set_cookie('k1',"aaaaaaaa")
res.set_cookie('k2',"bbbbbb")
return res
静态资源
静态文件
-
css、js、图片
- 创建static 根目录的 /static/
- 或者app目录下 /static/ app名称/文件夹
-
媒体文件:用户上传的数据(excel/pdf/video)
- 创建media 根目录的 /media/
-
settings中注册信息 settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
- 在html中尽量用反向生成
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<a href="/xxx/xxxxx/"> xx</a>
<a href="{% url 'login' %}">跳转</a>
<img src="{% static 'api/1.png' %}">
</body>
</html>
媒体文件
- 总路由上加
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
总结
记住上面那张流程图,大致的流程就是这样