
Django 5框架Web应用开发
文章平均质量分 82
夏天又到了
微信号 magicHawaii
展开
-
Django框架表单基础
本节主要介绍一下Django框架表单(Form)的基础知识。Django框架提供了一系列的工具和库来帮助设计人员构建表单,通过表单来接收网站用户的输入,然后处理以及响应这些用户的输入。原创 2024-11-13 18:00:43 · 912 阅读 · 0 评论 -
Django 5企业级Web应用开发实战-发送邮件
EMAIL_HOST_USER和EMAIL_HOST_PASSWORD设置(如果已设置)用于对SMTP服务器进行身份验证,而EMAIL_USE_TLS和EMAIL_USE_SSL设置控制是否使用安全连接。提供这些包装程序的目的是使电子邮件发送速度更快,使开发过程中的电子邮件发送测试更加容易,并为不能使用SMTP的平台提供支持。Django框架发送邮件的代码位于django.core.mail模块中,最简单的方法就是通过调用send_mail()方法来实现。请看下面关于发送邮件的代码实例。原创 2024-10-31 15:53:04 · 321 阅读 · 0 评论 -
Django 5企业级Web应用开发实战-分页
Django框架提供了一些类来帮助管理分页(Paginator)数据,即通过“上一页/下一页”链接拆分到多个页面的数据。这些类位于django/core/paginator.py模块中。Django框架使用的分页方法就是通过调用Paginator类来实现的。下面是在视图中对查询集进行分页的代码示例,同时提供视图和随附的模板,以说明如何显示结果。原创 2024-10-29 16:02:38 · 443 阅读 · 0 评论 -
Django 5企业级Web应用开发实战-日志
下面我们打开该日志文件查看一下,如图11.4中的箭头和标识所示,虽然Logger日志信息文件opt.log中输出了很多信息,但还是可以找到【代码11-9】中通过logger对象输出的调试信息。使用日志记录的方法很简单,在Django项目的配置文件setting.py中配置好Logger、Handle、Filter和Formatters后,就可以将需要的日志记录的调用放入代码中。日志记录还可以包含有用的元数据,该元数据描述了正在记录的事件,可以包括详细信息,例如堆栈跟踪或错误代码。如果没有,该消息将被忽略。原创 2024-10-28 16:43:37 · 946 阅读 · 0 评论 -
Django后台管理复杂模型
效果如图7.13中的箭头和标识所示,在该条Person模型的用户信息中,可以清楚地查看到Dep模型类型的外键。返回图7.10中的Dep和Person模型,分别单击该链接会跳转到相应数据表的可编辑页面,效果如图7.11和图7.12所示,刚刚添加的用户数据已经在页面上显示出来了。最后,刷新一下浏览器中的后台管理界面,具体页面效果如图7.10所示,后台管理模块界面中添加了刚刚创建的模型Dep。在第02行代码中,通过import关键字从模型中引入了Dep和Person模型。图7.11 Dep模型可编辑页面效果。原创 2024-09-18 15:12:23 · 1087 阅读 · 0 评论 -
Django日志
下面我们打开该日志文件查看一下,如图11.4中的箭头和标识所示,虽然Logger日志信息文件opt.log中输出了很多信息,但还是可以找到【代码11-9】中通过logger对象输出的调试信息。使用日志记录的方法很简单,在Django项目的配置文件setting.py中配置好Logger、Handle、Filter和Formatters后,就可以将需要的日志记录的调用放入代码中。日志记录还可以包含有用的元数据,该元数据描述了正在记录的事件,可以包括详细信息,例如堆栈跟踪或错误代码。如果没有,该消息将被忽略。原创 2024-09-10 08:34:21 · 1575 阅读 · 0 评论 -
Django缓存
对于Web动态网站而言,其基本权衡是动态的。每次用户请求页面时,Web服务器都会进行各种计算,包括从数据库查询数据、将模板渲染成实际的页面内容、处理业务逻辑,以及最终创建可供站点访问者查看的页面。从处理开销的角度来看,这种动态处理方式相较于从文件中读取数据的传统服务器系统而言,成本要高得多。对于大多数Web应用程序而言,此开销并不大,因为大多数Web应用程序只是流量一般的中小型网站。但是,对于中到高流量站点,则必须尽可能减少开销。这就是Web应用缓存的由来。原创 2024-09-09 08:25:40 · 1620 阅读 · 0 评论 -
Django发送邮件
使用EMAIL_HOST和EMAIL_PORT设置中指定的SMTP主机和端口发送邮件。EMAIL_HOST_USER和EMAIL_HOST_PASSWORD设置(如果已设置)用于对SMTP服务器进行身份验证,而EMAIL_USE_TLS和EMAIL_USE_SSL设置控制是否使用安全连接。Django框架发送邮件的代码位于django.core.mail模块中,最简单的方法就是通过调用send_mail()方法来实现。本文学习怎么使用Django发送邮件。请看下面关于发送邮件的代码实例。原创 2024-09-06 09:43:06 · 752 阅读 · 0 评论 -
Django框架测试工具
在表单文本输入框中填写与【代码8-12】中的第10行代码中相同的参数,然后单击Submit按钮进行提交,页面效果如图8.9所示。在Django框架的测试工具(Testing Tools)中,还提供了一个Test Client类,可以模拟一个简单的静态浏览器,允许用来测试视图函数。浏览器地址栏中GET请求传递的参数与页面中显示的内容是一致的。在第02~08行代码中,通过if条件语句判断request.method中HTTP方式是否为POST,如果结果为True,则继续执行下面的代码,否则返回一条字符串信息。原创 2024-09-05 08:08:26 · 1864 阅读 · 0 评论 -
Django缓存
为了方便起见,Django框架提供了不同级别的缓存粒度,既可以缓存特定视图的输出,也可以仅缓存难以生成的片段,甚至可以缓存整个站点。在本地安装好Memcached后,还需要安装Memcached的绑定,最常见的两种Python Memcached绑定方式是python-memcached和pylibmc。当然,如果不使用数据库缓存后端,则无须为数据库缓存模型提供路由指令。这个命令将在数据库中创建一张表,该表的格式与Django的数据库缓存系统期望的格式相同,且该表的名称取自LOCATION。原创 2024-09-04 08:36:56 · 1775 阅读 · 0 评论 -
使用Django身份验证系统
使用django.contrib.auth.models.Group模型是对用户进行分组的通用方法,可以向同一个组内的用户应用权限或其他标签。当在Django项目配置文件中的INSTALLED_APPS设置选项中添加django.contrib.auth模块时,该模块将为已安装的一个应用中定义的模型创建4个默认权限,即添加、更改、删除和查看。Django身份验证系统中仅存在一类用户,即超级用户(Superusers)或管理员用户这类设置了特殊属性的用户对象,而不是不同类的用户对象。原创 2024-09-03 09:26:32 · 1879 阅读 · 0 评论 -
Django国际化和本地化
在Django框架中,国际化和本地化的目标是允许单个Web应用程序针对不同的语言和格式提供相应的内容。Django框架完全支持文本翻译、日期、时间和数字格式以及时区格式。允许开发人员在模板上指定针对本地语言进行翻译,或者格式化其应用程序的相对应部分。根据特定用户的喜好对特定用户的Web应用程序使用特定的挂钩进行本地化操作。很明显,翻译取决于目标语言,格式通常取决于目标国家,浏览器在“接受语言”Header中提供此信息。但是,时区或许并不是很容易获得。国际化:为本地化准备软件,通常由开发人员完成。原创 2024-08-30 15:18:45 · 2062 阅读 · 0 评论 -
Django框架安全
Django框架安全中包括了保护Django驱动的网站的建议,具体内容如下:1. 跨站点脚本(XSS)保护XSS攻击使用户可以将客户端脚本注入其他用户的浏览器中。只要在包含数据到页面中之前未对数据进行充分的清理,XSS攻击就可以源自任何不受信任的数据源,例如Cookie或Web服务。使用Django模板可保护站点免受大多数XSS攻击,但更重要的是要了解其提供的保护及其限制。Django模板会转义特定字符,这对于HTML来说尤其危险。尽管这可以保护用户免受大多数恶意输入的侵害,但这并不是绝对安全的。原创 2024-08-29 08:21:21 · 1481 阅读 · 0 评论 -
Django框架自动化测试
对于使用Django框架的Web开发人员而言,自动化测试是一个非常有用的解决Bug的工具。设计人员可以使用一组测试(一个测试套件)来解决或避免许多问题,具体包括:(1)在编写新代码时,可以使用测试来验证代码是否按预期进行工作。(2)重构或修改旧代码时,可以使用测试来确保所做的更改不会意外影响应用程序的行为。测试Web应用程序是一项复杂的工作,因为Web应用程序通常是由几层逻辑组成的,从HTTP级别的请求处理到表单验证与处理,再到模板渲染等。原创 2024-08-28 11:18:56 · 904 阅读 · 0 评论 -
Django框架核心异常
说明:当从异步上下文(具有运行中的异步事件循环的线程)中调用仅在同步Python代码中允许的代码时,将会引发SynchronousOnlyOperation异常。请参看get()方法。说明:当处理程序正在读取HTTP正文的过程被中断并且客户端连接被关闭时,或者当客户端不发送数据并且服务器关闭连接超时时,将会引发RequestAborted异常。请参看get()方法。说明:当模型或父级模型上不存在请求的字段时,模型的_meta.get_field()方法会引发FieldDoesNotExist异常。原创 2024-08-19 09:02:12 · 629 阅读 · 0 评论 -
Django框架创建后台管理员账户
在Django框架后台管理中创建后台管理员账户,是为了更好地进行项目管理,管理员可以实现很多非常实用的功能。通过访问URL地址(http://127.0.0.1:8000/admin/),就可以进入后台管理的登录界面,页面效果如图7.2所示。下一步,通过浏览器访问Django服务器的默认URL地址(http://127.0.0.1:8000/),页面效果如图7.1所示。如图7.2中的箭头和标识所示,需要用户输入后台管理的用户名和密码才能进入模块内部界面。图7.1 启动MyAdminSite Web项目。原创 2024-08-15 09:45:45 · 488 阅读 · 0 评论 -
Django Form类详解
本节主要详细介绍Django框架中Form类的内容。Form类与Model类紧密关联,是构建Web应用的内部核心部件。原创 2024-08-12 16:19:47 · 1162 阅读 · 0 评论 -
使用Django框架表单
首先,通过FireFox浏览器打开一下FormSite项目中定义的formapp表单应用地址,具体如图6.1中的箭头和标识所示,HTML模板(userinfo.html)中显示了从表单模块(forms.py)和视图模块(views.py)中传递过来的空白的“用户信息”表单。现在,【代码6-4】为我们定义了一个可以工作的Web表单,其通过Django框架的Form类来描述,并由一个视图来处理并渲染成一个HTML模板中的表单(<form>)元素。在Django框架表单中,Form类的渲染工作要求视图来处理。原创 2024-08-09 09:22:11 · 707 阅读 · 0 评论 -
Django内置后端和自定义后端
在Django框架中,还设置了一种自定义后端。一个自定义后端是一个继承自django.template. backends.base.BaseEngine的类,必须实现get_template()函数方法和可选的from_string()函数方法。下面,请看一个自定义的foobar模板库的示例。【代码5-9】04060809 # 包含该模板引擎的模板的子目录名称10 # 在已安装的应用程序内12171921 try:2527 try:333538。原创 2024-08-06 10:52:14 · 1336 阅读 · 0 评论 -
Django配置模板引擎
本节主要介绍Django框架模板层中关于配置方面的内容,包括添加模板引擎支持、模板引擎用法、内置后端和自定义后端等方面。配置模板引擎是基于Django框架进行模板层开发的基础。原创 2024-08-05 15:07:38 · 1056 阅读 · 0 评论 -
Django文件上传
Django框架在处理文件上传时,文件最终会位于“:attr:request.FILES<django.http. HttpRequest.FILES>”。处理上面表单的视图将在request.FILES中接收到文件数据,可以使用request.FILES['file']来获取上传文件的具体数据,其中的键值“file”是根据“file = forms.FileField()”的变量名而来的。在第05行代码中,必须将request.FILES传入表单的构造方法中,只有这样文件数据才能绑定到表单中。原创 2024-08-02 15:50:50 · 1214 阅读 · 0 评论 -
Django之JsonResponse对象
在Django框架中,还定义了一个HttpResponse类的子类——JsonResponse类,是用于创建JSON编码类型响应的快捷类。如果不传递safe=False,将抛出一个TypeError。原创 2024-08-01 11:55:20 · 656 阅读 · 0 评论 -
Django的响应对象
(10)HttpResponse.set_signed_cookie(key,value,salt='',max_age=None,expires=None,path='/', domain= None, secure=False,httponly=False,samesite=None)方法:该方法与set_cookie()方法类似,但是在设置之前将对Cookie进行加密签名。(15)HttpResponse.tell()方法:该方法将HttpResponse实例看作类似文件的对象,移动位置 指针。原创 2024-07-31 09:01:50 · 903 阅读 · 0 评论 -
Django的请求对象
举例来讲,如果Web服务器配置中的WSGIScriptAlias参数设置为“/mydb”,那么当HttpRequest.path为“/article/authors/python/”时,HttpRequest.path_info则为“/mydb/article/authors/python/”。(1)HttpRequest.get_host()方法:该方法返回根据HTTP_X_FORWARDED_HOST(前提是被允许)和HTTP_HOST头部信息获取的请求的原始主机。原创 2024-07-30 13:51:24 · 886 阅读 · 0 评论 -
Django5之视图装饰器
在Django框架中,位于django.views.decorators.http模块的装饰器被用来限制可以访问该视图的HTTP请求方法。在浏览器支持的情况下,gzip_page()装饰器方法用于对视图的响应内容进行gzip视图压缩,该方法在django.views.decorators.gzip模块中定义。在第01行代码中,通过调用django.views.decorators.http模块(装饰器)导入了require_http_methods对象。本节主要介绍Django框架视图层中装饰器的内容。原创 2024-07-26 09:21:08 · 655 阅读 · 0 评论 -
Django 传递额外参数给视图函数
这样,额外参数{'foo': 'bar'}就传递给视图函数了。其中,第13行和第14行代码定义的path()函数将会自动获取mian模块传递过来的参数{'article_id': 3},效果等同于下面的【代码4-12】。在第05行代码中,通过path()函数包含了一个Python字典类型参数{'foo': 'bar'},该参数将会传递给视图函数views.year_archive。本例中第13行和第14代码中定义的path()函数的效果,等价于【代码4-11】传递参数的效果。原创 2024-06-04 12:54:13 · 677 阅读 · 0 评论 -
Django使用正则表达式
在第08行、第11行和第14行代码中,<year>组名严格匹配4位整数(如12345这样的整数是无法匹配的),这是由正则表达式?在Django框架的新版本(v2.0 +)中,URLconf模块虽然更改了配置方式,但它依然可以对老版本进行兼容,兼容的办法就是使用re_path()方法。P<year>[0-9]{4})/$也可以简写成未命名的形式[0-9]{4},但为了避免歧义,不建议这么做。在第07~09行、第10~12行和第13~15行代码中,re_path()方法使用的就是正则表达式方式。原创 2024-06-04 12:51:53 · 748 阅读 · 0 评论 -
Django的PATH路径转换器
在第07、08行代码定义了类方法to_url(),用于将Python数据类型转换为URL地址,并进行了格式化操作(使用数字“0”从左填充的4位整数)。其中,第09行、第10行和第11行中关于年份的类型使用了“yyyy”进行定义。在第04、05行代码定义了类方法to_python(),用于将4位整数(value)转换为Python数据类型。【代码4-3】(详见本书配套下载资源中的源代码中的urlconverter.py)在第02行代码定义了类属性regex,格式为4位整数的正则表达式。原创 2024-06-03 11:18:11 · 1013 阅读 · 1 评论 -
Django如何处理请求
(5)“/articles/2023/12/django-url-pattern/”:匹配第09行代码,并调用views.article_detail(request, year=2023, month=12, slug="django-url-pattern"视图。(4)继续导入并调用匹配行中给定的视图,该视图是一个简单的Python函数(被称为视图函数)或者是一个基于类的视图。(2)“/articles/2023”:无匹配结果,因为最后少了一个斜杠(/),而列表中的所有模式都以斜杠(/)结尾。原创 2024-06-03 11:14:31 · 699 阅读 · 0 评论 -
URL路由基础
一般情况下,在Django项目根目录下需要配置一个urls.py(根路由)文件,然后在每个App下分别定义一个自己的urls.py,这样就相当于是一种比较先进的解耦模式。在图4.1中,客户端用户发来的HTTP请求经过URL路由映射处理后,会发送到相应的View视图处理函数进行处理,View视图函数处理完成后,再通过HttpResponse对象返回具体信息到客户端进行显示。在第02行代码中,通过调用django.urls模块导入了path(路径)对象,这是一个负责URL路由配置的模块。原创 2024-05-31 08:39:23 · 656 阅读 · 0 评论 -
Django框架视图基础
在Django框架视图层的概念体系中,视图函数简称为视图,它是一个简单的Python函数,用于接收Web请求和返回Web响应。Django框架视图层对外负责接收用户请求,对内负责调度模型层与模板层,是连接用户前端页面和底层数据库的桥梁。Django框架的视图层还有一点特殊之处,就是它会根据业务逻辑将处理好的数据与前端进行整合后再返回给用户,从这方面来讲Django视图层更偏向于所谓的“后端”。Django视图层是负责处理请求的核心,是开发Web应用的重要组成部分。注:此图引用自互联网博客文章。原创 2024-05-31 08:36:52 · 472 阅读 · 0 评论 -
Django5之命名空间
当出现上述这种情况时,如果在某个视图中使用reverse('index', args=(...)),或在模板中使用{% url 'index' ... %},那么最终生成的URL地址到底是路由A还是路由B呢?在Django框架中,要实现对URL链接地址的反向解析,除了应用级别的命名空间方式之外,还支持一种实例命名空间(namespace)方式。在第06行和第07行代码中,在ptah()函数中新定义了一个namespace属性,属性值就是实例命名空间。在第07行代码中,还是要添加app_name属性的定义。原创 2024-04-29 08:54:44 · 959 阅读 · 0 评论 -
Django URL路由配置之反向解析
因为,当URLconf模块被修改后,设计人员势必将手动修改HTML页面中的每一个超链接<a>标签中硬编码的href属性值,其工作量是可想而知的。例如下面这样一个很常见的场景,在页面中展示一个文章标题列表,且每个标题都被设计成一个超链接,单击该链接就进入对应文章的详细页面。在第07行代码中,在path()函数中新增了一个name参数(name='article-year-archive'),该参数主要在模板中使用。在第07~13行代码中,通过在HTML页面中使用for循环语句,实现了文章标题列表的显示。原创 2024-04-28 09:41:48 · 1735 阅读 · 1 评论 -
URL路由基础与Django处理请求的过程分析
一般情况下,在Django项目根目录下需要配置一个urls.py(根路由)文件,然后在每个App下分别定义一个自己的urls.py,这样就相当于是一种比较先进的解耦模式。(1)决定要使用的根URLconf模块。(2)加载这个URLconf模块并寻找可用的urlpatterns路由模式,它是django.urls.path()实例或django.urls.re_path()实例的一个列表。在第02行代码中,通过调用django.urls模块导入了path(路径)对象,这是一个负责URL路由配置的模块。原创 2024-04-26 08:27:47 · 1423 阅读 · 1 评论 -
Django框架视图基础
在Django框架视图层的概念体系中,视图函数简称为视图,它是一个简单的Python函数,用于接收Web请求和返回Web响应。Django框架视图层对外负责接收用户请求,对内负责调度模型层与模板层,是连接用户前端页面和底层数据库的桥梁。Django框架的视图层还有一点特殊之处,就是它会根据业务逻辑将处理好的数据与前端进行整合后再返回给用户,从这方面来讲Django视图层更偏向于所谓的“后端”。Django视图层是负责处理请求的核心,是开发Web应用的重要组成部分。原创 2024-04-26 08:23:55 · 256 阅读 · 1 评论 -
Django5框架之多重继承
在第04~09行代码中,定义了第一个继承自基类Piece的类Article,它是一个用于描述文章的模型。在第11~16行代码中,定义了第二个继承自基类Piece的类Book,它是一个用于描述书籍的模型。在第09~10行代码中,定义了一个子类BookArticle,它是一个用于描述书籍和文章的模型,同时继承自Article模型和Book模型。在第18、19行代码中,定义了一个子类BookArticle,它是一个用于描述书籍和文章的模型,同时继承自Article模型和Book模型。原创 2024-04-25 08:39:04 · 498 阅读 · 1 评论 -
Django5框架之代理模型
一个代理模型既可以继承任意数量的抽象模型类(假设它没有定义任何模型字段),也可以继承任意数量的代理模型(只需共享同一个非抽象父类)。再次回看一下【代码3-24】,当使用Person模型对象进行查询时,Django框架是不会返回Child模型对象的,对于Person模型对象的查询结果集,总是返回相对应的类型(QuerySet仍会返回请求的模型)。比如在【代码3-25】中,也许不期望总是对Person进行排序,但在使用代理时总是会依据last_name属性进行排序,解决方法可参看下面的代码示例。原创 2024-04-25 08:37:19 · 1158 阅读 · 0 评论 -
Meta和多表继承,继承与反向关系
在Django模型继承中,由于多表继承使用隐式的OneToOneField连接子类和父类,因此直接从父类访问子类是可能的。第01~04行代码中,定义了一个子类Restaurant,它继承自父类Place。其中,在第02行代码中定义了子类与父类的ManyToManyField关系。但是,如果在继承父类模型的子类中添加了这些关联,则必须指定related_name属性。第02行代码在定义子类与父类的ManyToManyField关系中,添加了“related_name='provider'”属性。原创 2024-04-24 08:52:09 · 967 阅读 · 0 评论 -
Django模型继承之多表继承
在Django模型继承中,支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,并且可以被独立查询和创建。在第07~10行代码中,定义了一个继承自抽象基类Place的、用于表示酒店的子类Hotel。在上述例子中,如果p不是一个Hotel对象,而仅仅是一个Place对象(又或是其他类的父类对象),那么指向p.hotel就会抛出一个Hotel.DoesNotExist类型的异常。在第03~05行代码中,定义了一个用于表示地点的抽象基类Place。原创 2024-04-24 08:49:28 · 1192 阅读 · 1 评论 -
related_name和related_query_name属性
在Django模型继承中,假如在外键或多对多字段中使用了related_name属性或related_query_name属性,则必须为该字段提供一个独一无二的反向名字和查询名字。但是,这样在抽象基类中一般会引发问题,因为基类中的字段都被子类继承并且保持了同样的值,这其中当然也包括related_name属性和related_query_name属性。不过,如果在设计时忘了使用“%(class)s”和“%(app_label)s”,那么Django会在执行系统检查或运行迁移时抛出错误。原创 2024-04-23 08:27:22 · 1023 阅读 · 0 评论