1、什么是wsgi?uwsgi?uWSGI?
wsgi是一种通信规范,规定请求和响应的格式;uwsgi是一种通信协议,不过跟WSGI分属两种东西,该协议下速度比较快;uWSGI是web服务器,支持uwsgi、http两种协议,它的功能是把HTTP协议转化成语言支持的网络协议供python使用。
在Python Web开发中,uWSGI通常被用作应用程序的部署工具,使得Python Web应用程序的性能和稳定性都能得到很好的保障。WSGI只是一种规范,它并没有实现任何具体的功能。因此,为了使用WSGI,你需要选择一个符合WSGI规范的Web服务器和Python Web框架,比如常用的uWSGI、Gunicorn、Nginx等Web服务器,以及Django、Flask等Web框架。
2、django的请求生命周期?
客户端请求--->WSGI创建request对象--->请求中间件--->url匹配到视图--->业务逻辑,操作数据库---->响应中间件---->uWSGI服务器---->返回响应给客户端---->拿到数据渲染
3、列举django的内置组件?
Admin 后台管理系统 - 可以快速生成 CRUD 界面。
ORM 对象关系映射 - 提供了针对数据库的高级抽象层,使得可以通过Python代码轻松地操作数据库中的数据。
Forms 表单 - 用于为 Web 应用程序创建HTML表单,表单验证,并将表单输入转换为Python对象。
- ModelForm组件:Django的ModelForm组件是一个用于创建表单的类,它与Django的数据库模型(Model)类紧密结合。ModelForm组件可以自动创建表单,并将表单数据与数据库模型进行关联。这使得开发人员可以快速、方便地创建表单,并将表单数据存储到数据库中。
- Email组件可以帮助开发人员快速、方便地发送电子邮件,并与用户进行交互。
- 内置的中间件组件:可以帮助开发人员更好地处理请求和响应,并提高Web应用程序的性能和安全性。
4、列举django中间件的5个方法?以及django中间件的应用场景?
process_request : 请求进来时,权限认证
process_view : 路由匹配之后,能够得到视图函数
process_exception : 异常时执行
process_template_responseprocess : 模板渲染时执行
process_response : 请求有响应时执行
5、简述什么是FBV和CBV?
FBV: 函数视图,CBV类试图,通常用类试图,提高代码复用性,利用对象方便操作
6、django的request对象是在什么时候创建的?
将请求的内容封装成request对象,源码如何查看:from django.core.handlers.wsgi import WSGIHandler,请求经过WSGI,封装成request对象
class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
请求走到WSGIHandler类的时候,执行cell方法,将environ封装成了request
7.django为什么request.user能访问到用户对象?
用户信息存储在会话(session)中,用户请求后,用户信息会封装到request对象,所以能用request.user访问;也和中间件有点关系。
request.user
由于 Django 的身份验证中间件,能够检索与给定请求会话关联的用户对象。如果未检索到用户,则返回AnonymousUser匿名用户
8.django的中间件各有什么作用?
django.middleware.security.SecurityMiddleware
:此中间件为请求/响应周期提供了多项安全增强功能。
django.contrib.sessions.middleware.SessionMiddleware:会话中间件,这个中间件提供了对Django的session框架的支持。利用session框架处理用户会话数据的创建和管理。
corsheaders.middleware.CorsMiddleware
:此中间件是一个跨源资源共享 (CORS) 中间件,允许配置 CORS 标头,允许 Web 应用程序从不同的域访问自己的资源。
django.middleware.common.CommonMiddleware
:通用中间件,提供了一些杂项功能,如 GZip 压缩、Etag 等。
django.middleware.csrf.CsrfViewMiddleware:CSRF (Cross-site request forgery) 防御中间件,Django 默认启用。对于 POST、PUT 和 DELETE 请求需要在 CSRF 字段中包含 CSRF 令牌以阻止跨站点请求伪造攻击。
django.contrib.auth.middleware.AuthenticationMiddleware
:该中间件使用会话将用户与请求相关联。 它处理用户身份验证,以及使用经过身份验证的用户对象填充请求对象
django.contrib.messages.middleware.MessageMiddleware:消息中间件,为应用程序提供了向用户发送消息的功能。
django.middleware.clickjacking.XFrameOptionsMiddleware:此中间件设置 X-Frame-Options 标头以防止点击劫持攻击;提供了防止网站被其他网站的iframe嵌入的能力,避免了通过 iframe 的方式进行点击劫持攻击。
8.django项目模块中每个py文件的作用?
models.py:该文件定义了数据库模型类,并且通常还包含与数据库交互的方法。
views.py:该文件包含视图函数,这些函数接收HTTP请求并返回HTTP响应。
urls.py:该文件定义了URL路由规则,将不同的URL映射到相应的视图函数上。
forms.py:该文件定义了表单类,用于处理用户提交的数据。
admin.py:该文件定义了后台管理界面中的模型类显示和编辑方式。
apps.py:该文件定义了应用程序配置信息,例如应用名称和应用启动时需要运行的代码等。
tests.py:该文件包含测试用例,用于测试应用程序的各种功能。
middleware.py:该文件包含Django中间件的实现,中间件用于在请求和响应之间执行额外的逻辑。
9.select_related和prefetch_related的区别?
在 Django ORM 中,
select_related()
和prefetch_related()
都是优化查询性能的方法,但它们的使用场景略有不同。
select_related()
用于查询外键关联的数据,它会在一次 SQL 查询中将所有相关对象的数据都取出来。这就减少了数据库的访问次数,并且可以缓存查询结果以提高后续查询的性能。使用select_related()
的前提是要存在外键关系,一对一,一对多方面。而
prefetch_related()
用于查询多对多关联或者反向外键关联的数据,它会执行两条 SQL 查询:第一条查询主表数据,第二条查询关联的数据并将其缓存起来。当需要访问关联数据时,直接从缓存中读取,避免了多次访问数据库的开销。
10.列举django orm中三种能写sql语句的方法?
11.values和values_list的区别?
12.如何使用django orm批量创建数据?
13.django的Model中的ForeignKey字段中的on_delete参数有什么作用?
14.django中csrf的实现机制 ?
开启csrf中间件,服务端生成令牌,返回给客户端存储,进行令牌验证
15.Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别)?
16.Django如何实现websocket?
17.django APP默认的应用程序作用?
'django.contrib.admin'
: 提供 Django 管理后台,让您可以通过Web界面管理您的应用程序数据。
'django.contrib.auth'
: 提供用户认证和授权功能,包括用户注册、登录、注销和密码重置等。
'django.contrib.contenttypes'
: 提供基于模型的内容类型框架,使您可以使用通用的外键关系来引用不同模型之间的对象。
'django.contrib.sessions'
: 提供会话框架,使您可以跟踪每个客户端用户在Web站点上进行的活动,并将状态信息存储在服务器上,以便下次请求时恢复它们。
'django.contrib.messages'
: 提供消息框架,使您可以向用户显示临时消息,例如成功或失败的操作消息。
'django.contrib.staticfiles'
: 提供静态文件框架,使您可以轻松地组织和部署静态资源,例如CSS、JavaScript和图像文件等。
18.Django中CSRF的实现机制?
django第1次响应来自某个客户端的请求时,服务器随机产生1个token值,把这个token保存在session中;同时服务器把这个token放到cookie中交给前端页面;
该客户端再次发起请求时,把这个token值加入到请求数据或者头信息中,一起传给服务器;
服务器校验前端请求带过来的token和session里的token是否一致。
19.跨域请求Django是如何处理的?
使用第三方工具 django-cors-headers 即可彻底解决
- 注册app
- 添加中间件
- 配置运行跨域请求方法
20.什么是信号量?
在 Django 中,信号量是一种机制,用于在模型的生命周期中发送或接收信号通知。当某些事件发生时(例如保存、删除、添加等),Django 将会发送一个信号,这个信号可以被其他部分接收并处理。如,在订单保存后需要向用户发送电子邮件通知。
21.web框架的本质是什么?
web框架本质是一个socket服务端,用户的浏览器是一个socket客户端。
22.谈谈你对restful规范的认识?
23.Django缓存系统类型有哪些?
1. 全站缓存,较少使用
MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, # 第一 'django.middleware.common.CommonMiddleware', ‘django.middleware.cache.FetchFromCacheMiddleware’, # 最后 )
在django中使用内存缓存:
from django.core.cache import cache def get_data_from_db(): # 从数据库获取数据 data = ... return data def get_cached_data(): data = cache.get('cached_data') if data is None: data = get_data_from_db() cache.set('cached_data', data, timeout=3600) # 将查询结果缓存在内存中,过期时间为1小时 return data
2. 视图缓存,用户视图函数或视图类中(
cache_page
是 Django 框架提供的一个视图缓存装饰器,可以将指定视图的输出结果进行缓存,并在接下来的请求中直接返回缓存中的内容,从而提高响应速度和降低服务器负载。使用该装饰器时需要传入一个以秒为单位的整数作为参数,表示缓存的时间。)from django.views.decorators.cache import cache_page import time @cache_page(15) #超时时间为15秒 def index(request): t=time.time() #获取当前时间 return render(request,"index.html",locals())
3. 模板缓存,指缓存不经常变换的模板片段
{% load cache %}
<h3 style="color: green">不缓存:-----{{ t }}</h3>{% cache 2 'name' %} # 存的key
<h3>缓存:-----:{{ t }}</h3>
{% endcache %}
24.什么是ASGI,简述WSGI和ASGI的关系与区别?
WSGI和ASGI都是Python设计的网关接口,用于连接Web服务器和Web应用程序。WSGI是基于http协议模式开发的,为同步应用程序提供标准,但不支持Websocket。ASGI是为异步、同步应用程序提供标准,支持Websocket。ASGI是WSGI的扩展。
《路由层》
25.路由优先匹配原则是什么?
位置优先匹配
26.django urlpatterns中的name与namespace的区别。
name和namespace是用于URL反向解析的两个重要参数。
name:给路由起一个别名
namespace:防止多个应用之间的路由重复,防止路由冲突
27.Django路由系统中include是干嘛用的?
include用作路由转发,通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发。
《模型层》
28.Django的Model的继承有几种形式?
抽象基类继承,abstract=True。
代理模型继承,proxy=True。
多继承,都继承model.Model
29.class Meta中的元信息字段有哪些?
Model类可以通过元信息类设置索引和排序信息。
元信息是在Model类中定义一个Meta子类
class Meta:
# ---常用
db_table = 'table_name' # 自定义表名
index_together = ('tag1', 'tag2') # 联合索引
unique_together = ('tag3', 'tag4') # 联合唯一索引
verbose_name = 'table_name' # /admin/中显示的表名称
verbose_name_plural = verbose_name
ordering = 'ordering_tag' # 排序字段#这个选项是指定,模型的复数形式是什么
abstract =True # 抽象基类
# ---非常用
# app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,
# 这时候你需要指定你这个模型类是那个应用程序的。
# 比如你在其他地方写了一个模型类,而这个模型类是属于myapp的
app_label='myapp'
# db_table 是用于指定自定义数据库表名的。
db_table='my_owner_table'
# 有些数据库有数据库表空间,比如Oracle。你可以通过db_tablespace来
# 指定这个模型对应的数据库表放在哪个数据库表空间。
db_tablespace
# 由于Django的管理方法中有个lastest()方法,就是得到最近一行记录。
# 如果你的数据模型中有 DateField 或 DateTimeField 类型的字段,
# 你可以通过这个选项来指定lastest()是按照哪个字段进行选取的
get_latest_by = "order_date"
# 由于Django会自动根据模型类生成映射的数据库表,如果你不希望Django这么做,可以把managed的值设置
# 为False。默认值为True,这个选项为True时Django可以对数据库表进行 migrate或migrations、
# 删除等操作。在这个时间Django将管理数据库中表的生命周期如果为False的时候,不会对数据库表进行
# 创建、删除等操作。可以用于现有表、数据库视图等,其他操作是一样的。
managed
# permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让
# 指定的方法权限描述更清晰可读。要创建一个对象所需要的额外的权限. 如果一个对象有 admin 设置,
# 则每个对象的添加,删除和改变权限会人(依据该选项)自动创建.
# 下面这个例子指定了一个附加权限: can_deliver_pizzas:
permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
# 这个选项一般用于多对多的关系中,它指向一个关联对象。就是说关联对象找到这个对象后它是经过排序的。
# 指定这个属性后你会得到一个get_XXX_order()和set_XXX_order()的方法,
# 通过它们你可以设置或者回去排序的对象。
order_with_respect_to = 'pizza'
30.Django模型类关系有哪几种?
- 一对一关系:OneToOneField
- 一对多关系:ForeignKey
- 多对多关系:ManyToManyField
31.外键有什么用,什么时候合适使用外接,外键一定需要索引吗?
使用外键可以实现数据的完整性和一致性,防止数据损坏或异常情况导致的问题。
外键的使用时机取决于你的数据模型和应用需求。如果你的数据模型需要多个表之间建立关联,那么就需要使用外键来维护这些关联。
对于外键是否需要索引,取决于具体的查询需求。如果你经常需要根据外键列进行查询和连接操作,那么将外键列创建索引可以提高查询性能。但是,如果外键列很少被查询,那么无需为它们创建索引,因为索引也是需要开销的。
32.Primary Key和Unique Key的区别?
- Primary key与Unique Key都是唯一性约束。
- Primary key是主键,一个表只能有一个,Unique key是唯一键,一个表可以有多个唯一键字段。
- Primary key 必须不能为空,Unique Key 可为空。
33.外键字段中related_name的作用?
related_name
属性指定从相关对象返回到当前对象的反向关系的名称。在这种情况下,它定义了从Person
模型返回到Car
模型的反向关系的名称。Django 默认为模型中的每个外键字段自动生成一个反向关系名称,使用模型名称的小写形式后跟 "_set"。但是当您显式设置
related_name
属性时,可以自定义此反向关系名称。在上面的代码中,设置related_name='cars'
意味着反向关系从Person
到Car
将被命名为 "cars",而不是使用默认名称 "car_set"。
34.如何通过外键,子表查询父表和父表查询子表?
父表与子表关系:
from django.db import models class Person(models.Model): name = models.CharField(max_length=64) age = models.IntegerField() tel = models.CharField(max_length=64) @property def all_cars(self): '''返回全部信息''' return self.cars.all() @property def info(self): '''返回部分信息''' return '%s %s' % (self.name, self.tel) class Car(models.Model): owner = models.Foreignkey(Person, related_name='cars') # 给主表设置的cars属性,用于反向查找 name = models.CharField(max_length=64) price = models.FloatField()子表查询父表
car = Car.objects.get(id=1)
# 查询该车的车主
owner = car.owner
父表查询子表Tom = Person.objects.get(id=1)
# 查询此人有多少车
# 方式一:
# Django默认每个主表对象都有一个外键的属性,可以通过它来查询所有属于主表的子表信息
# 查询方式:主表.子表_set(),返回值为一个queryset对象
Tom.Car_set().all()
# 方式二:
# 通过在外键中设置related_name属性值既可
Tom.cars.all()
# 方式三:
# 通过@property装饰器在model中预定义方法实现
Tom.all_cars
35.谈 GenericForeignkey 和 GenericRelation
GenericForeignKey和GenericRelation是非常强大的Django功能,可以使模型设计变得更加灵活和具有可扩展性。它们适用于需要处理多态关系或需要轻松访问与另一个模型相关联的对象的任何应用程序。能和任何模型都能连接起来,保证了代码的干净。避免了创建大量无用的空数据,有效减少存储空间和服务器压力。
36.ORM如何取消级联?
user = models.ForeignKey(User,blank=True,null=True,on_delete=models.SET_NULL)
在父表被删除,null为True的时候就会取消级联(子表设置为null)
37.查询集的2大特性?什么是惰性执行?
Django的查询集有两个主要特性:
- 惰性执行(Lazy Evaluation):Django的查询集不会立即执行数据库查询,而是等到需要获取结果时才会执行。这意味着您可以在查询集上链式调用多个方法,而不必担心每个方法都会执行一次查询。
例如,假设我们有一个模型类
Book
,它有一个字段price
,我们想要获取价格大于100的所有书籍:books = Book.objects.filter(price__gt=100)这里的
filter()
方法只是定义了查询条件,并没有实际执行查询。只有当我们想要获取查询结果时才会执行实际的数据库查询,例如:for book in books: print(book.title, book.price)
- 缓存(Caching):Django的查询集会缓存查询结果,以避免重复查询。如果您对同一个查询集进行多个操作,Django只会在第一次查询时从数据库中获取数据,之后的操作都会使用查询结果的缓存。
例如,如果我们继续上面的示例,并想要按价格降序排序书籍结果:
sorted_books = books.order_by('-price')这里的
order_by()
方法并不会触发另一次数据库查询,而只是对已经缓存的查询集进行排序操作。需要注意的是,如果您修改了查询集所对应的模型实例,缓存将会失效,Django会重新执行数据库查询。
如果对象需要多次引用,可以先定义一个查询集,就如同上面的例子。
37.查询集返回的列表过滤器有哪些?
all():返回所有数据
filter():返回满足条件的数据
exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
order_by():排序
38.QueryDict和dict区别?
在 HttpRequest 对象中,属性 GET 和 POST 得到的都是 django.http.QueryDict 所创建的实例。这是一个django 自定义的类似字典的类,用来处理同一个键带多个值的情况。在 python 原始的字典中,当一个键出现多个值的时候会发生冲突,只保留最后一个值。而在 HTML 表单中,通常会发生一个键有多个值的情况,例如,多选框就是一个很常见情况。request.POST 和request.GET 的QueryDict 在一个正常的请求/响应循环中是不可变的。若要获得可变的版本,需要使用.copy()方法。
39.Django中查询Q和F的区别?
Q对象是用于构建复杂的查询语句的对象。使用Q对象可以实现逻辑或、逻辑且和逻辑非等多种运算。
# 导入Q对象 from django.db.models import Q # 创建一个大Q对象 q = Q() # 设置大Q对象中的小Q之间都是用 '或' 连接 q.connector = 'OR' # 添加课程名中包含燃脂条件 q.children.append(Q(('name__contains','燃脂'))) # 添加课程名中包含减脂条件 q.children.append(Q(('name__contains','减脂'))) # 查找课程名称包含燃脂/减脂的 VODClasses.object.filter(q) # 查询作者名字是猎虎或者价格大于5000的书 res = models.Bbook.objects.filter(Q(authors__name='猎虎')|Q(price__gt=5000)) for re in res: print(re.name) # 查询作者名字是猎虎并且价格大于5000的书 res = models.Bbook.objects.filter(Q(authors__name='猎虎',price__gt=5000)) for re in res: print(re.name) # 查询作者名字不是猎虎的书 res = models.Bbook.objects.filter(~Q(authors__name='猎虎')) for re in res: print(re.name) # 多重嵌套查询 res = models.Bbook.objects.filter((Q(authors__name='猎虎') & Q(price__gt=100)) | Q(id__lt=29)) for re in res: print(re.name)使用F对象可以方便地进行字段间的比较和计算
# 导入F对象 from django.db.models import F # 查询评论数大于阅读数的书籍 res = models.Bbook.objects.all().filter(commit_num__gt=F('read_num')) for re in res: print(re.name) # 查询评论数大于阅读数2倍的书籍 res = models.Bbook.objects.all().filter(commit_num__gt=F('read_num')*2) for re in res: print(re.name)
说一说django orm的annotate和aggretive方法?
annotate和aggregate都是用于进行聚合操作的方法,annotate()方法用于给每条记录添加一个新的属性,而aggregate()方法用于对整个查询结果进行聚合操作。
如:
from django.db.models import Sum, F match_list.values("team").annotate(Sum('score')).order_by("-score__sum") # 总的 total_sales = Book.objects.aggregate(total_sales=Sum('price')) # 每列 books = Book.objects.annotate(discount_price=F('price') * (1 - F('discount')))
说一说django orm 的choice?
Django ORM 中的
choices
是一个元组,用于定义模型的字段选项。通常情况下,choices
用于限制字段的取值范围。可用于下拉框或限制字段取值范围from django.db import models class Book(models.Model): GENRE_CHOICES = ( ('sci-fi', 'Science Fiction'), ('horror', 'Horror'), ('romance', 'Romance'), ) title = models.CharField(max_length=100) author = models.CharField(max_length=50) genre = models.CharField(max_length=10, choices=GENRE_CHOICES)取choice元组的第二个值:
# 创建一个Book实例 book = Book.objects.create(title='The Hitchhiker\'s Guide to the Galaxy', author='Douglas Adams', genre='sci-fi') # 访问Book实例的genre字段中的第二个值 second_value = book.get_genre_display()[1]
《视图层》
40.常用视图响应的方式有哪些?
- 常用视图响应的方式有4种方式redirect、Response、HttpResponse和JsonResponse
return Response({content=响应体, content_type=响应体数据类型, status=状态码) return HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码) return JsonResponse({‘city’: ‘beijing’, ‘subject’: ‘python’},status=response.status_code) return redirect(‘/index.html’)
41.在视图函数中,常用的验证装饰器有哪些?
装饰器 用途
@login_required() 检查用户是否通过身份验证
@group_required() 检查用户是否属于有权限的用户组访问
@anonymous_required() 检验用户是否已经登录
@superuser_only() 它只允许超级用户才能访问视图
@ajax_required 用于检查请求是否是AJAX请求
@timeit 用于改进某个视图的响应时间,或者只想知道运行需要多长时间
《高阶》
42.Django如何实现高并发?
- Nginx + uWSGI + Django
- Nginx + gunicorn + gevent + Django
Gunicorn是一个Python Web服务器,如果您的应用需要处理大量请求并且需要高可靠性,那么 Gunicorn 是一个非常好的选择。
gevent是一个Python的第三方库,它提供了基于协程的并发编程能力,在一些高并发场景下,gevent还能够有效地降低服务器的负载,并提高系统的吞吐量,如果你需要编写高效、高性能的网络应用程序,那么使用gevent是一个不错的选择。
43.如何提高Django应用程序的性能?
1.使用缓存技术,将常用的高频数据存储缓存,redis缓存,django的视图缓存,内存缓存。
2.耗时任务使用celery消息队列来进行异步操作。
3.提升服务器性能。
4.使用uwsgi+nginx部署,合适配置
5.前端优化:使用浏览器缓存;css,js压缩等
44.Django中当用户登录到A服务器进入登陆状态,下次被nginx代理到B服务器会出现什么影响?
如果用户在A应用服务器登陆的session数据没有共享到B应用服务器,那么之前的登录状态就没有了。
45.谈谈对Celery的理解?
46.celery有哪些应用场景?
异步任务:当用户在网站进行某个操作需要很长时间完成时,我们可以将这种操作交给Celery执行,直接返回给用户,等到Celery执行完成以后通知用户,大大提好网站的并发以及用户的体验感。例如:发送验证邮件
定时任务:向定时清除沉余数据或批量在几百台机器执行某些命令或者任务,此时Celery可以轻松搞定。
47.Celery的工作原理是什么?
48.Django中遇到耗时任务,你会怎么处理?
1.配置celery,使用异步任务;
2.使用threading、multiprocessing、gevent、asyncio、concurrent,多线程,多进程,协程,异步执行,并行执行任务
3.使用视图缓存、内存缓存、redis缓存,避免重新加载
4.使用django的信号signals机制,在增删改等其他操作触发时,异步执行其他耗时任务
49.Django settings中有哪些重要的设置?
DEBUG
:一个布尔值,用于指定是否启用调试模式。如果设置为True,则显示详细的错误消息和堆栈跟踪信息,这对于开发过程中非常有用。但是,在生产环境中,请务必将其设置为False。
ALLOWED_HOSTS
:一个字符串列表,用于指定可以访问该应用程序的主机名或IP地址。这个设置对于增强安全性非常重要,因为它防止了恶意用户通过伪造host头攻击您的应用程序。
DATABASES
:一个字典,包含关于应用程序数据库的连接信息。Django支持多种数据库引擎(MySQL、PostgreSQL、SQLite等),并允许您在同一个项目中使用多个数据库。
STATIC_URL
和STATICFILES_DIRS
:用于指定静态文件的URL和位置。静态文件通常包括CSS、JavaScript和图像等资源,这些资源需要被web服务器直接提供给客户端。
MEDIA_URL
和MEDIA_ROOT
:用于指定媒体文件的URL和位置。媒体文件通常包括用户上传的图像、视频和音频等资源。
TEMPLATES
:一个列表,包含关于应用程序模板的配置信息。Django使用模板引擎将数据渲染到HTML页面中。
TIME_ZONE
:用于指定应用程序的时区。这在处理日期和时间时非常重要,因为不同的时区可能会导致不同的时间差。
LANGUAGE_CODE
和USE_I18N
:用于指定应用程序的默认语言和是否启用国际化支持。Django提供了多语言支持,允许您将应用程序本地化为不同的语言。
SECRET_KEY
:一个用于加密cookie和密码等信息的随机字符串。这个设置非常重要,因为它可以防止潜在的安全漏洞。
MIDDLEWARE
:一个列表,包含关于应用程序中间件的配置信息。中间件是请求和响应之间执行的代码段,可以用于添加或修改HTTP头、认证用户、缓存响应等操作。
50.Django如何使用多线程?
Django 是一个基于 Python 的 web 开发框架,可以通过使用多线程来提高并发处理能力。假设我们有一个视图函数
my_view
,它需要调用一个长时间运行的任务。为了避免阻塞其他请求,我们可以将这个任务放在一个独立的线程中处理。import threading from django.http import HttpResponse def my_view(request): # 长时间运行的任务 def long_running_task(): # 处理代码 pass # 创建一个新线程来处理任务 task_thread = threading.Thread(target=long_running_task) task_thread.start() # 返回响应 return HttpResponse("Task started")在这个例子中,我们使用 threading 模块创建了一个新的线程来处理长时间运行的任务。通过这种方式,我们可以让 Django 在后台继续处理其他请求,而不会被长时间运行的任务阻塞。
需要注意的是,多线程编程需要考虑线程安全性,例如在访问共享资源时需要使用锁等机制来避免竞态条件。
51.在使用Django开发项目时有没有遇到什么问题?
考你解决问题的能力:
1.性能问题
2.部署和管理
3.提交代码冲突4.线上比赛
5.数据库迁移问题
参考链接:https://developer.aliyun.com/article/656942
参考链接:https://blog.csdn.net/weixin_41622043/article/details/103426652