Django框架总结
Web应用

问题1:描述一个Web应用的工作流程。(如上图所示)
问题2:描述项目的物理架构。(上图中补充反向代理服务器、负载均衡服务器、数据库服务器、文件服务器、缓存服务器、防火墙等,每个节点都有可能是多节点构成的集群)
问题3:描述Django项目的工作流程。(如下图所示)

MVC架构模式

问题1:为什么要使用MVC架构模式?(模型和视图解耦合)
问题2:MVC架构中每个部分的作用?(如上图所示)
HTTP请求和响应
HTTP请求
HTTP请求 = 请求行+请求头+空行+[消息体]

HTTP响应 = 响应行+响应头+空行+消息体

HTTPRequest对象的属性和方法:
methodpath/get_full_path()scheme/is_secure()/get_host()/get_port()META/COOKIESGET/POST/FILESget_signed_cookie()is_ajax()body/content_type/encoding
中间件添加的属性:
session/user/site
HttpResponse对象的属性和方法:
set_cookie()/set_signed_cookie()/delete_cookie()__setitem__/__getitem__/__delitem__charset/content/status_code
JsonResponse(HttpResponse的子类型)对象class HouseJsonEncoder(JsonEncoder): def default(self, o): # 定义如何将对象转成dict类型并返回这个字典 pass>>> from django.http import JsonResponse >>> response = JsonResponse({ 'foo': 'bar'}) >>> response.content >>> response = JsonResponse([1, 2, 3], safe=False) >>> response = JsonResponse(house, encoder=HouseJsonEncoder) >>> response = HttpResponse('') >>> response['cotent-type'] = 'application/pdf'; >>> response['content-disposition'] = 'inline; filename="xyz.pdf"' >>> response['content-disposition'] = 'attachment; filename="xyz.pdf"' >>> response.set_signed_cookie('', '', salt='') >>> response.status_code = 200
数据模型(Model)
问题1:关系型数据库表的设计应该注意哪些问题?(范式理论)
问题2:关系型数据库中数据完整性指的是什么?(实体完整性/参照完整性/域完整性)
问题3:ORM是什么以及解决了什么问题?(对象模型-关系模型双向转换)
Field及其子类的属性:- 通用选项:
db_column/db_tablespacenull/blank/defaultprimary_keydb_index/unqiuechoices/help_text/error_message/editable/hidden
- 其他选项:
CharField:max_lengthDateField:auto_now/auto_now_addDecimalField:max_digits/decimal_placesFileField:storage/upload_toImageField:height_field/width_field
- 通用选项:
ForeignKey的属性:重要属性:
db_constraint(提升性能或者数据分片的情况可能需要设置为False)on_deleteCASCADE:级联删除。PROTECT:抛出ProtectedError异常,阻止删除引用的对象。SET_NULL:把外键设置为null,当null属性被设置为True时才能这么做。SET_DEFAULT:把外键设置为默认值,提供了默认值才能这么做。related_name
class Dept(models.Model): pass class Emp(models.Model): dept = models.ForeignKey(related_name='+', ...) Dept.objects.get(no=10).emp_set.all() Emp.objects.filter(dept__no=10)其他属性:
to_field/limit_choices_to/swappable
Model的属性和方法objects/pksave()/delete()from_db()/get_XXX_display()/clean()/full_clean()
QuerySet的方法get()/all()/values()count()/order_by()/exists()/reverse()filter()/exclude()exact/iexact:精确匹配/忽略大小写的精确匹配查询contains/icontains/startswith / istartswith / endswith / iendswith:基于like的模糊查询in:集合运算gt/gte/lt/lte:大于/大于等于/小于/小于等于关系运算range:指定范围查询(SQL中的between…and…)year/month/day/week_day/hour/minute/second:查询时间日期isnull:查询空值(True)或非空值(False)search:基于全文索引的全文检索regex/iregex:基于正则表达式的模糊匹配查询aggregate()/annotate()Avg/Count/Sum/Max/Min
>>> from django.db.models import Avg >>> Emp.objects.aggregate(avg_sal=Avg('sal')) (0.001) SELECT AVG(`TbEmp`.`sal`) AS `avg_sal` FROM `TbEmp`; args=() {'avg_sal': 3521.4286}>>> Emp.objects.values('dept').annotate(total=Count('dept')) (0.001) SELECT `TbEmp`.`dno`, COUNT(`TbEmp`.`dno`) AS `total` FROM `TbEmp` GROUP BY `TbEmp`.`dno` ORDER BY NULL LIMIT 21; args=() <QuerySet [{ 'dept': 10, 'total': 4}, { 'dept': 20, 'total': 7}, { 'dept': 30, 'total': 3}]first()/last()only()/defer()>>> Emp.objects.filter(pk=7800).only('name', 'sal') (0.001) SELECT `TbEmp`.`empno`, `TbEmp`.`ename`, `TbEmp`.`sal` FROM `TbEmp` WHERE `TbEmp`.`empno` = 7800 LIMIT 21; args=(7800,) <QuerySet [<Emp: Emp object (7800)>]> >>> Emp.objects.filter(pk=7800).defer('name', 'sal') (0.001) SELECT `TbEmp`.`empno`, `TbEmp`.`job`, `TbEmp`.`mgr`, `TbEmp`.`comm`, `TbEmp`.`dno` FROM `TbEmp` WHERE `TbEmp`.`empno` = 7800 LIMIT 21; args=(7800,) <QuerySet [<Emp: Emp object (7800)>]>create()/update()/raw()>>> Emp.objects.filter(dept__no=20).update(sal=F('sal') + 100) (0.011) UPDATE `TbEmp` SET `sal` = (`TbEmp`.`sal` + 100) WHERE `TbEmp`.`dno` = 20; args=(100, 20) >>> >>> Emp.objects.raw('select empno, ename, job from TbEmp where dno=10') <RawQuerySet: select empno, ename, job from TbEmp where dno=10>
Q对象和F对象>>> from django.db.models import Q >>> Emp.objects.filter( ... Q(name__startswith='张'), ... Q(sal__lte=5000) | Q(comm__gte=1000) ... ) # 查询名字以“张”开头且工资小于等于5000或补贴大于等于1000的员工 <QuerySet [<Emp: 张三丰>]>reporter = Reporters.objects.filter(name='Tintin') reporter.update(stories_filed=F('stories_filed') + 1)原生SQL查询
from django.db import connection with connection.cursor() as cursor: cursor.execute("UPDATE TbEmp SET sal=sal+10 WHERE dno=30") cursor.execute("SELECT ename, job FROM TbEmp WHERE dno=10") row = cursor.fetchall()模型管理器
class BookManager(models.Manager): def title_count(self, keyword): return self.filter(title__icontains=keyword).count()
视图函数(Controller)
如何设计视图函数
用户的每个操作对应一个视图函数。
每个视图函数构成一个事务边界。
事务的概念。
事务的ACID特性。
事务隔离级别。
Read Uncommitted < Read Committed < Repeatable Read < Serializable
set global transaction isolation level repeatable read; set session transaction isolation level read committed; select @@tx_isolation;Django中的事务控制。
- 给每个请求绑定事务环境(反模式)。
ATOMIC_REQUESTS = True- 使用事务装饰器。
@transaction.non_atomic_requests @transaction.atomic- 使用上下文语法。
with transaction.atomic(): pass- 关闭自动提交。
AUTOCOMMIT = Falsetransaction.commit() transaction.rollback()
URL配置
可以让部分URL只在调试模式下生效。
from django.conf import settings urlpatterns = [ ... ] if settings.DEBUG: urlpatterns += [ ... ]可以使用命名捕获组捕获路径参数。
url(r'api/code/(?P<mobile>1[3-9]\d{9})'), path('api/code/<str:mobile>'),URL配置不关心请求使用的方法(一个视图函数可以处理不同的请求方式

本文详述了Django框架的各个方面,包括其Web应用结构、MVC模式、HTTP请求响应、数据模型、视图函数、URL配置、模板、中间件、表单、Cookie和Session、缓存、日志、RESTful API设计、安全保护、测试和部署策略。通过实例解析了Django在实际项目中的应用,以及性能优化和安全防护措施。

6185

被折叠的 条评论
为什么被折叠?



