百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

谈谈 django 应用实践 django基础实验报告

bigegpt 2024-10-07 06:28 4 浏览

python 的 web 框架非常多,比较出名的有 django, flask, tornado。django 作为一个老牌框架,无论是文档还是代码质量都非常高,另外他自带的 admin 后台和一些有用的 app,如果你的需求是做 cms 之类的 web 应用的话,基本上不用开发多少代码就能出一个成品。不过很多新手可能一开始不太适应他的设计模式,遇到问题后基本就懵了,所以这里我按照自己用 django 的经验,写一下 django 的一些应用实践,可能写的比较零散,大家见谅。

整体流程

首先我们得了解下 django 这个框架整体的处理流程,假设我们采用 nginx + uwsgi + django 的 web server 模式

1. 一个请求过来后,首先经过 nginx 做反向代理,将请求转发到 uwsgi (python 用 wsgi 这种协议来解析 http 请求,uwsgi 是一个 解析 wsgi 的应用),uwsgi 再将解析过的数据传到 django。

2. django 收到请求后,首先会经过一组全局的中间件 (middleware),调用 process_request 作为预处理,比如解析用户状态,检验 csrf_token (post 请求),如果有问题,则直接返回 response,不再调用 view 函数。否则,调用 process_view ,如果没问题进入 view 函数。

3. 进入 view 函数后开发者可以写自己的逻辑,比如操作数据库,更新缓存,最后返回一个 response。

4. 接下来 跳出 view 函数,重新进入 middleware,调用 process_response,对 response 做些最后的修饰,返回给用户。

views 模块

1. view 不仅可以用函数,也可以用通用视图类(generic_view),好处是:代码更加清晰,可以复用继承,并且结合 mixin 能够开发更加灵活的 view 模块

def hello_fn(request, name="World"):
 return HttpResponse("Hellp {}!".format(name))
class FeedMixin(object):
 def get_context_data(self, **kwargs):
 context = super().get_context_data(**kwargs)
 context["feed"] = models.Post.objects.viewable_posts(self.request.user)
 return context
 
class MyFeed(FeedMixin, generic.CreateView):
 model = models.Post
 template_name = "myfeed.html"
 success_url = reverse_lazy("my_feed")

2. python 的装饰器很好用,也可以用于 views 函数, 比如下面的装饰器用于登录用户的检测

@login_required
def simple_view(request):
 return HttpResponse()

urls 模块

1.urls.py 这个文件将访问的 url 跟 view 模块对应起来,按从上到下的顺序匹配

2. 采用 include 函数可以包含其他 app 的 urls,namespace 参数定义后可以在模板中直接调用,比如

{% url 'articles'%} 
url(r'^articles/
, include(articles.urls), namespace="articles"),

models 模块

1. model 是具有处理数据库的一种面向对象的方法的类,能够让不熟悉数据库语句的程序员也能快速操作数据库

2. 采用面向对象的方式创建类,加上 abstract = True 则为抽象类

class Postable(models.Model):
 created = models.DateTimeField(auto_now_add=True)
 modified = modified.DateTimeField(auto_now=True)
 message = models.TextField(max_length=500)
 class Meta:
 abstract = True
class Post(Postable):
 ...
class Comment(Postable):
 ···

3. django 表对应关系有一对一(OneToOneField),一对多 (ForeignKey),多对多 (ManyToManyField),其中 多对多的模式通过创建一个中间表来实现。

class Book(models.Model):
 place = models.OneToOneField(Place, primary_key=True)
 pub=models.ForeignKey(Publisher)
 authors=models.ManyToManyField(Author)

上面的例子中间表包括 author_id 和 book_id

4. django 的 signal 实现 hook 数据库写行为,比如,pre_save, post_save,pre_delete, post_delete,你也可以自定义 signal, hook 其他行为。

@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
 instance.product.stock -= instance.amount
 instance.product.save()

5. Person.objects.all(), 这里面的 objects 其实是个 manager, 实现了 all, filter 等函数,可以自定义。

class Person(models.Model):
 object = models.Manager()

6. django 的 queryset 是惰性的,只有在真正用的时候才会去数据库查询,并且查询一次后,会有缓存,当再次遍历这个 queryset 的时候,不会再去查询。

person_set = Person.objects.filter(first_name="Dave")

7. 数据库第一次创建后,会有再次更新字段的需求。django 在 1.4 版本前并没有这个功能,得用第三方库 south 来更新,后来的版本 django 自带了 migration 功能,能够将最新的 model 版本和数据库的字段作对比,自动生成 migration 文件

 python manage.py makemigrations # 生成 migration 文件
 python manage.py migrate # 将更改应用到数据库

8. orm 不能直接看到 raw sql 语句,可以通过如下语句查看 sql

from django.db import connection
connection.queries

9. 可以使用 django-debug-toolbar 插件查看慢查询,也能对对哪些页面载入较慢有个大致的了解。

10. 在 orm 中使用 select_related() 减少查询数据库次数:,select_related() 会自动扩展外键关系

class Province(models.Model):
 name = models.CharField(max_length=10)
class City(models.Model):
 name = models.CharField(max_length=5)
 province = models.ForeignKey(Province)
citys = City.objects.select_related().all()

不过对于高并发的应用来说外键不是很推荐。

forms 模块

1. 前端传上来一个表单的值,但是没法确认这些值是不是为空,是不是类型正确,这个时候当然可以自己一个个值判断,也可以采用 forms 模块去做验证,用过 django-rest-framework 的同学会知道和里面的 serializers 是同一个概念

class PersonDetailsForm(forms.Form):
 name = forms.CharField(max_length=100)
 age = forms.IntegerField()

2. 如果你用的是模板渲染的方式,那么展示的时候更简单,表单能自动生成 html 的表单。

>>> f = PersonDetailsForm()
>>> print(f.as_p())
<p><label for="id_name">Name:</label> <input id="id_name" maxlength="100"
name="name" type="text" /></p>
<p><label for="id_age">Age:</label> <input id="id_age" name="age"
type="number" /></p>

admin 模块

1. admin 基本上开箱即用,如果需要定制的话,也能做一些组件的定制,不过这些东西得看文档去详细了解了。

commands 模块

1. django 提供了后台脚本模块,可以自己集成 BaseCommand 类去自定义脚本

python mannage.py -h

这个命令就能看到所有的 commands 命令

2. 如果不想用他的模块,又想引入 django 项目的一些模块,可以采用下面的方法解决

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()

settings 模块

1. 所有的 settings 默认值都在这里面能找到,

2. 上线的时候记得把 DEBUG 改成 False, 然后加上 ALLOWED_HOSTS

3. MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL 这几个之前经常搞混,其实可以分为两类,MEDIA_ROOT 指的是上传文件的目录,MEDIA_URL 指的是前缀名, 其中的media 就是 MEDIA_URL, 同样,STATIC_ROOT 指的是静态文件的目录,一般放 css, js 之类,STATIC_URL 值得是前缀名,

4. 一般部署上线的时候,用 nginx 直接渲染静态文件

 location /media {
 alias /root/example_project/public/media;
 }
 location /static {
 alias /root/example_project/static;
 }

contrib 模块

1. 这里面的模块是 django 自带的 apps,用的比较多的有 admin, auth, sessions

2. admin 模块其实就是 django 的后台

3. auth 模块就是用户模块,功能上比较齐全,基本上可以基于这个模块做扩展。

4. session 模块结合 auth ,用来做用户的登录状态,对于大型网站来说,session 的存储可能是个问题,django 也提供了不同的 backends,支持 db, cache, file 等存储方式。

middleware 模块

1. django 自带的 middlreware 对于普通网站的需求已经蛮完善了,比如 CsrfMiddleware , HttpMiddleware。

2. 如果有自己的需求,也可以自定义,比如记录详细 log 信息,LogMiddleware,还有跨域的 CorsMiddleware。

其他

1. 网上有人说 django 只能做小网站,不支持大的并发,其实这个说法还是很片面的。django 自身只是一个框架,如果网站请求处理慢,很多情况下是自己写的逻辑没有优化。确认是 django 框架问题的话,django 虽然设计上略复杂,但是很多模块还是可以拆分去自定义的。最后实在不济,靠增加机器数量也能顶一阵。

2. django 的国际化模块做的很不错

3. setting 文件可分成 product, 和 dev 两份,根据开发环境和生产环境不同引入不同的 setting 文件。

4. django-celery 用来执行异步任务

5. django 的插件非常多,

6. 其他想到的再更新。。。

相关推荐

Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析

这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...

我用C#造了个AI程序员:自动调试+重构代码实战

在软件开发的世界里,调试和重构代码往往占据了程序员大量的时间。我一直梦想着能有一个智能助手,帮我处理这些繁琐的工作。于是,我决定用C#打造一个AI程序员,让它具备自动调试和重构代码的能力。系统架构设计...

公文自动排版vba代码(公文自动排版vba代码)

Sub公文自动排版()'设置页面参数(单位:厘米)WithActiveDocument.PageSetup.TopMargin=CentimetersToPoints(3.7)&#...

Anthropic最强代码神器:Claude Code系统提示词

最近,在融合Opus-4之后,ClaudeCode的整体能力直线飙升.甚至一度把曾经的最强开发工具——Cursor打的抬不起头来。无论是代码生成的准确度,还是智能补全的丝滑体验,都让人印象深...

使用 Ruff 进行 Python 代码格式化与静态检查

随着Python项目的规模增大,保持一致的代码风格和高质量的代码变得尤为重要。Ruff是一个现代、高性能、支持lint和格式化的Python工具,能帮助你快速发现并修复常见代码问题。本文...

基础语法篇:格式化输出 含完整示例代码

所谓格式化输出就是按照一定格式来输出对应的内容,在Python的语法中格式化输出包含两种:格式化符号、格式化字符串一、格式化符号常用的格式化符号包括%s(将内容转换为字符串,放入占位位置)、%d(将内...

代码整洁如诗!Keil 插件上线,一键格式化代码,告别风格混乱!

引言:代码格式不统一?你的团队还在为“括号位置”吵架吗?嵌入式开发者们,你是否经历过这些抓狂瞬间?代码风格“百花齐放”:同事的代码缩进用空格,你的用Tab,合并时冲突频发!手动调整耗时费力:为了通过C...

[信捷PLC] 信捷PLC之C函数编程(一)

前言写PLC程序,越来越觉得结构化文本编程语言(ST)给PC编程带来的便利,在处理一些数据上,可以写的更加灵活。所以,在项目PLC选型上,我都会优先选择支持结构化文本的PLC。国内有些厂商推出了一些较...

C语言-HelloWorld解析(c语言的helloworld怎么写)

使用VisualStudio2017开发工具新创建一个项目,编写第一个C语言程序。#include<stdio.h>voidmain(){printf("HelloW...

VSCode 配置 C++ 开发环境!教程详解

第一步、安装VSCode应用程序打开VSCode官网,下载对应安装包并默认安装(这里指明:安装路径可以修改)第二步、安装相关插件此时的VSCode仅仅是一个英文文本编辑器,还称不上开发工具,所以需要...

C语言进阶教程:C语言与汇编语言交互

C语言和汇编语言的交互是底层编程和性能优化中的一个重要方面。理解它们如何协同工作,可以帮助开发者更好地控制硬件、优化关键代码段以及理解编译器的行为。为什么需要在C语言中嵌入汇编?尽管C语言已经提供了相...

C语言如何处理平台相关代码(c语言的开发平台)

在进行跨平台C编程时,不可避免地会遇到需要针对不同操作系统或硬件架构编写特定代码的情况。C语言通过预处理器指令,特别是条件编译指令,为我们提供了处理平台相关代码的有效机制。最常用的就是利用预定义的宏(...

C语言:hello world(c语言helloworld代码)

环境:a.初学者建议用“啊哈C”,这款软件简单易装;b.devc.visualstdiod.Vc6.0第一行代码:#include<stdio.h>#<stdio.h&g...

C语言之编译器集合(编写c语言编译器)

C语言有多种不同的编译器,以下是常见的编译工具及其特点:一、主流C语言编译器1.GCC(GNUCompilerCollection)特点:开源、跨平台,支持多种语言(C、C++、Fortran...

适合零基础初学者学习C语言第一课教程,揭开C语言的神秘面纱

一、C语言简介我刚接触编程,首先想要学习的就是C语言,这次我就把我的感悟用我自己理解的文字表述出来,这样对刚学C语言的人来说,才是比较友好的。因为我们都没有C语言的基础,不懂啥是编程,啥事代码。我们...