最新Django面试题_django面试题目,字节面试官

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

cursor.fetchall()




---



### **11** **如何使用django orm批量创建数据**



使用django.db.models.query.QuerySet.bulk\_create()批量创建对象,减少SQL查询次数。改进如下:



querysetlist=[]
for i in resultlist:
querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)




---



### **12 命令makemigrations和migrate的差别**


生成迁移文件



python manage.py makemigrations


执行迁移



python manage.py migrate




---


### 13 视图函数中,接收的请求对象常用方法和属性有哪些


* path属性,获取请求页面的全路径,不包括域名
* method属性,获取请求中使用的HTTP方式的字符串表示。全大写表示
* GET属性,获取HTTP GET方式请求传参,的参数(字典类型)
* POST属性,获取表单类型的请求体数据
* **body**属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。**request.body****返回****bytes****类型。**
* **META**属性获取请求头headers中的数据,**request.META****为字典类型**。




---



### **14** **常用视图响应的方式是什么?**


**视图的响应返回使用****HttpResponse**



HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)


一般不用这种方式,我习惯使用:  



response = HttpResponse(‘language python’) 
response.status_code = 400 
response[‘languaget’] = ‘Python’
return response


**返回****json****数据,可以使用****JsonResponse****来构造响应对象**


设置响应头Content-Type为 application/json,例子:



from django.http import JsonResponse

def demo_view(request): 
return JsonResponse({‘city’: ‘beijing’, ‘subject’: ‘python’})


**redirect****重定向**


我们也可以将返回的结果重定向到另一个页面或接口, 例子:



from django.shortcuts import redirect

def demo_view(request): 
return redirect(‘/index.html’)




---



### **15 HTTP****响应常见状态码分类**


![https://img2018.cnblogs.com/blog/1165731/201810/1165731-20181004144650140-126124281.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTE2NTczMS8yMDE4MTAvMTE2NTczMS0yMDE4MTAwNDE0NDY1MDE0MC0xMjYxMjQyODEuanBn?x-oss-process=image/format,png)




---



### **16** **路由匹配原则是什么?**


关于正则匹配优先级(**由上而下**)


在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条。




---



### **17** **缓存系统类型有哪些**


* **全站缓存**



MIDDLEWARE_CLASSES = (
‘django.middleware.cache.UpdateCacheMiddleware’, # 第一
‘django.middleware.common.CommonMiddleware’,
‘django.middleware.cache.FetchFromCacheMiddleware’, # 最后
)


* **视图缓存**



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())


* **模板缓存**



{% load cache %}

不缓存:-----{{ t }}


{% cache 2 ‘name’ %} # 存的key

缓存:-----:{{ t }}


{% endcache %}




---



### **18** **解决跨域的常用方式是什么?**


跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。



> 
> 广义的跨域:
> 
> 
> 1. 资源跳转:A链接、重定向、表单提交
> 2. 资源嵌入:link script img frame等dom标签,还有样式中background:url()、@font-face()等文件外链
> 3. 脚本请求:js发起的ajax请求、dom和js对象的跨域操作等
> 
> 
> 


同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。



> 
> 同源策略限制以下几种行为:
> 
> 
> 1. Cookie、LocalStorage 和 IndexDB 无法读取
> 2. DOM 和 Js对象无法获得
> 3. AJAX 请求不能发送
> 
> 
> 




---



### **19** **信号的作用是什么?**


**Django中如何在Model保存前做一定的固定操作,比如写一句日志?**


关键词:**信号**


利用Django的Model的Signal Dispatcher, 通过`django.db.models.signals.pre_save()` 方法,在事件发生前,触发信号,这一切都被调度中的receiver方法深藏功与名的保存了。


信号的处理一般都写在Model中,举个例子:



import logging
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
 
class Order(models.Model):
    # …
 
 
logger = logging.getLogger(name)
 
@receiver(pre_save, sender=Order)
def pre_save_handler(sender, **kwargs):
    
    # 我们可以在Order这个Model保存之前尽情调戏了:)
    logger.debug(“{}”.format(sender, **kwargs))
    print ‘fuck universe’


这样应该就实现了题中的要求,类似的方法还有比如 `pre_init` 是在Model实例之前会触发, `post_init` 在实例之后触发,同理就是 `pre_save` 和 `post_save` 了。




---



### **20 Django****的Model的继承有几种形式,分别是什么**


#### 抽象继承


表示你的父类仅仅是包含了多个子类的相同的字段,是为了重用,不会建表,我们只需要在抽象父类的Meta中设置abstract=True就行。比如:



class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()

class Meta:
    abstract = True

class Student(CommonInfo):
home_group = models.CharField(max_length=5)


 Student模型将会有name,age,home\_group三个字段。如果在抽象父类和子类中出现相同的字段名字,django会引发异常。


对于内联的Meta类的继承,一般的,父类的Meta类的属性会继承给子类,子类也可以在自己的Meta中重写或者拓展父类的Meta,拓展的话主要是继承父类的Meta:



class CommonInfo(models.Model):

class Meta:
abstract = True
ordering = [‘name’]

class Student(CommonInfo):

class Meta(CommonInfo.Meta):
db_table = ‘student_info’


这个时候,父类Meta中的abstract=True是不会传递给子类的,django会将子类的abstract设置为False


除了abstract之外,父类Meta中的db\_table也不会继承给子类


在抽象类中使用关系(如外键,多对多关系,一对一关系)时候,肯定会设置related\_name,但是子类继承抽象父类的时候,由于父类中的字段会继承给子类,则具有related\_name的字段会被多个子类共享的。这样每一个子类的related\_name就都一样了,其他模型通过related\_name就不能找到正确的子类。


所以要正确设置related\_name,related\_name中必须包含%(app\_label)s 和 %(class)s。如



> 
> %(app\_label)s表示小写形式的,当前模型所在的,并且已经安装的app的名字
> 
> 
> %(class)s表示小写形式的,当前子类的类名字。
> 
> 
> 


在common/models.py,有



class Base(models.Model):
m2m = models.ManyToManyField(OtherModel, related_name=“%(app_label)s_%(class)s_related”)

class Meta:
    abstract = True

class ChildA(Base):
pass

class ChildB(Base):
pass


在rare/models.py,有



from common.models import Base

class ChildB(Base):
pass


 所以,上面的related\_name就是 common\_childa\_related和 common\_childb\_related


####  多表继承


父类也是一个django模型,并且也会创建一个数据表,多表继承是django中隐式的一对一关系。例如:



class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)

class Restaurant(Place):
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()


其中虽然name和address存储在模型Place的表中,但是name和address对于Restaurant也是有效字段 



Place.objects.filter(name=“Bob’s Cafe”)
Restaurant.objects.filter(name=“Bob’s Cafe”)


Restaurant和Place的关系,可以这么说:一个Restaurant一定是一个Place,而一个Place不一定是Restaurant 


多表继承中,一般,父类的Meta属性不会继承到子类中,但是,ordering和 get\_latest\_by是继承的,如果子类不想继承父类的ordering的Meta,则可以手动显式的指定ordering=[]或者任何自己想要的值


多表继承的时候,是隐式的在父类和子类之间建立一个一对一关系,所以有时候,父类与其他类的关系会从父类下移到子类中。如果有多个子类,且子类不在关系中显式地指定related\_name字段,django会引发验证错误



class Supplier(Place):
# Must specify related_name on all relations.
customers = models.ManyToManyField(Restaurant, related_name=‘provider’)


所以,继承父类,一旦子类中有关系,就加上related\_name吧


django自动在子类和非抽象父类之间创建一个一对一关系,如果你想控制由子类连接回父类的属性的名字,你可以创建一个一对一关系,然后设置parent\_link=True 


#### proxy model(代理模型)


在多表继承中,子类模型会创建一个数据表来存储不在父类模型中的额外字段,但是,如果我们只想改变某个模型的行为方法,而不是添加额外的字段,我们就可以使用


proxy model。代理model(proxy model)会继承父类的属性,并且只是添加一些对属性的操作的自定义方法而已。



class MyPerson(Person):
class Meta:
proxy = True

def do_something(self):
    ...zh

这里,MyPerson没有多创建数据表,MyPerson也是对Person的数据表进行操作,一般的,我们可以把MyPerson当做Person来使用,只是在do\_something这个方法略有不同,比如



p = Person.objects.create(first_name=“foobar”)
MyPerson.objects.get(first_name=“foobar”)
<MyPerson: foobar>


 代理模型和原模型的区别如下面:



class OrderedPerson(Person):
class Meta:
ordering = [“last_name”]
proxy = True


这里,OrderedPerson并不是创建了一个表,而是代理排序方法。也就是说,使用Person的检索方法并不会按last\_name排序,而使用OrderedPerson检索出来的结果是按last\_name排序的。OrderedPerson使用与Person类一样的检索方法。


OrderPerson返回的queryset自然是Person的,这是当然的。我们不能要求django返回OrderedPerson类的queryset,因为OrderedPerson只是代理而已,又不是真实的数据库表类。


注意的是,proxy model不能继承于抽象类,这是因为代理model是操作连接数据库的,也不能多重继承~因为你多重继承了,代理model就不知道去哪个父类找属性了


如果不指定代理model的manage,则代理model会自动继承父类的manage。我们也可以手动设置代理model的manage,这样,代理模型和父类模型的manage就分开了


为代理模型添加manage有两种方法:


一是直接在代理模型中直接指定manage 



class NewManager(models.Manager):

class MyPerson(Person):
objects = NewManager()

class Meta:
    proxy = True

另外一种是当你不想覆盖父类模型中的manage但又想添加额外的manage,我们可以新建一个抽象模型,然后定义其manage,之后继承该抽象模型,如:



Create an abstract class for the new manager.

class ExtraManagers(models.Model):
secondary = NewManager()

class Meta:
    abstract = True

class MyPerson(Person, ExtraManagers):
class Meta:
proxy = True




---



### **21 Django****中查询queryset时什么情况下用Q**


F:对数据本身的不同字段进行操作 如:比较和更新,对数据进行加减操作


Q:用于构造复杂的查询条件 如:& |操作




---



### **22 Django****中想验证表单提交是否格式正确需要用到Form中的哪个函数**


form.is\_valid():返回布尔值




---



### **23 orm****如何取消级联**


在设置外键时,需要通过**on\_delete**选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:


* **CASCADE** 级联,删除主表数据时连通一起删除外键表中数据
* **PROTECT** 保护,通过抛出**ProtectedError**异常,来阻止删除主表中被外键应用的数据
* **SET\_NULL** 设置为NULL,仅在该字段null=True允许为null时可用
* **SET\_DEFAULT** 设置为默认值,仅在该字段设置了默认值时可用
* **SET()** 设置为特定值或者调用特定方法




---



### **24 Django****中如何读取和保存session,整个session的运行机制是什么**



更新

在django—session表中创建一条记录:

session-key                            session-data

ltv8zy1kh5lxj1if1fcs2pqwodumr45t        更新数据

else:

生成随机字符串    ltv8zy1kh5lxj1if1fcs2pqwodumr45t

response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t)

在django—session表中创建一条记录:

session-key                            session-data

ltv8zy1kh5lxj1if1fcs2pqwodumr45t        {"is_login":True,"username":"yuan"}



---



### **25** **简述Django对http请求的执行流程**


在接受一个Http请求之前的准备,启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器。  


服务器根据WSGI协议指定相应的Handler来处理Http请求,并且初始化该Handler,在Django框架中由框架自身负责实现这一个Handler。 此时服务器已处于监听状态,可以接受外界的Http请求 当一个http请求到达服务器的时候   


服务器根据WSGI协议从Http请求中提取出必要的参数组成一个字典(environ)并传入Handler中进行处理。  


在Handler中对已经符合WSGI协议标准规定的http请求进行分析,比如加载Django提供的中间件,路由分配,调用路由匹配的视图等。 返回一个可以被浏览器解析的符合Http协议的HttpResponse。




---



### **25 Django****中当用户登录到A服务器进入登陆状态,下次被nginx代理到B服务器会出现什么影响**


如果用户在A应用服务器登陆的session数据没有共享到B应用服务器,那么之前的登录状态就没有了。




---



### **26** **跨域请求Django是如何处理的**


* 启用中间件
* post请求
* 验证码
* 表单中添加{% csrf\_token %}标签




---



### **27** **查询集的两大特性?什么是惰性执行**


* 惰性执行、缓存 。
* 创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用




---



### **28** **查询集返回的列表过滤器有哪些**


* all():返回所有数据
* filter():返回满足条件的数据
* exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
* order\_by():排序




---



### 


### **29 django****路由系统中include是干嘛用的?**


include路由转发


通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。




---



### 


### **30 urlpatterns****中的name与namespace有什么作用?你是如何使用的?**


别名,给路由起一个别名


名称空间,防止多个应用之间的路由重复




---


### 31 如何根据urlpatterns中的name反向生成url,这样反向生成url的方式有几种?


使用HttpResponseRedirect redirect和reverse 状态码:302,301




---



### **32** **如何给一个字段设置一个主键?**


primary\_key




---



### **33** **如何设置一个带有枚举值的字典?**


![https://img2018.cnblogs.com/blog/1165731/201810/1165731-20181004144652113-1730714562.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTE2NTczMS8yMDE4MTAvMTE2NTczMS0yMDE4MTAwNDE0NDY1MjExMy0xNzMwNzE0NTYyLnBuZw?x-oss-process=image/format,png)




---



### **34 DateTimeField****类型中的auto\_now与auto\_now\_add有什么区别**


* **DateTimeField.auto\_now**


这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且**每次修改model,都会自动更新**。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的。


* **DateTimeField.auto\_now\_add**


这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto\_now类似,auto\_now\_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。




---




### **35 selected\_related****与prefetch\_related有什么区别?**


在Django中,所有的Queryset都是惰性的,意思是当创建一个查询集的时候,并没有跟数据库发生任何交互。因此我们可以对查询集进行级联的filter等操作,只有在访问Queryset的内容的时候,Django才会真正进行数据库的访问。而多频率、复杂的数据库查询往往是性能问题最大的根源。


不过我们实际开发中,往往需要访问到外键对象的其他属性。如果按照默认的查询方式去遍历取值,那么会造成多次的数据库查询,效率可想而知。


在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询。


1,select\_related适用于外键和多对一的关系查询;


2,prefetch\_related适用于一对多或者多对多的查询。




---



### 


### **36 class Meta中的元信息字段有哪些**


通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样:



class User(AbstractUser):
“”“用户模型类”“”
mobile = models.CharField(max_length=11, unique=True, verbose_name=‘手机号’)
email_active = models.BooleanField(default=False, verbose_name=‘邮箱验证状态’)
default_address = models.ForeignKey(‘Address’, related_name=‘users’, null=True, blank=True,
on_delete=models.SET_NULL, verbose_name=‘默认地址’)

class Meta:
    db_table = 'tb_users'
    verbose_name = '用户'
    verbose_name_plural = verbose_name



---



### **37 django****的M2M关系,如何手动生成第三张表?**



tags = models.ManyToManyField(
to=“Tag”,
through=‘Article2Tag’,
through_fields=(‘article’, ‘tag’),
)




---



### **38****在Django中,服务端给客户端响应信息有几种方式?分别是什么?**


* HTTPresponse
* jsonresponse
* redirect




---




### **39 web框架的本质是什么?**


本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。




---



### **40 创建Django工程、Django app、以及运行的命令**



创建新的项目

django-admin.py startproject my_project

在Django项目(my_project)的根目录下执行

python3 manage.py startapp my_app

启动Django中的开发服务器

run server

python3 manage.py runserver




---



### **41 django****中csrf的实现机制**


第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;


第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}


第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;




---



### **42 Django App****的目录结构**


![https://img2018.cnblogs.com/blog/1165731/201810/1165731-20181004144652630-946167967.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTE2NTczMS8yMDE4MTAvMTE2NTczMS0yMDE4MTAwNDE0NDY1MjYzMC05NDYxNjc5NjcucG5n?x-oss-process=image/format,png)




---



### 


### 


### **43****什么是Cookie、如何获取、设置Cookie**


会话跟踪技术,保留用户


Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。


具体一个浏览器针对一个服务器存储的key-value



response.set_cookie(“is_login”,True)
request.COOKIES.get(“is_login”)




---



### **44****什么是session,与cookie的对比、设置、获取、清空session**


Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。 



request.session[“is_login”] = True
is_login = request.session.get(“is_login”)
request.session.flush()




---



### **45****什么是CSRF,及防范方式**


* 启用中间件
* post请求
* 验证码
* 表单中添加{%csrf\_token%}标签




---



### **46 get****请求和post请求的区别**


* GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。
* GET提交的**数据大小**有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
* GET与POST请求在服务端获取请求数据方式不同。
* GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。




---



### 47 如何使用django加密


Django 内置的User类提供了用户密码的存储、验证、修改等功能,默认使用pbkdf2\_sha256方式来存储和管理用的密码。


django通过setting.py文件中的PASSWORD\_HASHERS来设置选择要使用的算法,列表的第一个元素 (即settings.PASSWORD\_HASHERS[0]) 会用于储存密码, 所有其它元素都是用于验证的哈希值,它们可以用于检查现有的密码。意思是如果你打算使用不同的算法,你需要修改PASSWORD\_HASHERS,来将你最喜欢的算法在列表中放在首位。


一个settings中的Password\_hashers看起来是这样的:



PASSWORD_HASHERS = (
‘django.contrib.auth.hashers.PBKDF2PasswordHasher’,
‘django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher’,
‘django.contrib.auth.hashers.BCryptSHA256PasswordHasher’,
‘django.contrib.auth.hashers.BCryptPasswordHasher’,
‘django.contrib.auth.hashers.SHA1PasswordHasher’,
‘django.contrib.auth.hashers.MD5PasswordHasher’,
‘django.contrib.auth.hashers.CryptPasswordHasher’,
)


具体的密码生成以及验证实现



from django.contrib.auth.hashers import make_password,check_password

pwd=‘4562154’
mpwd=make_password(pwd,None,‘pbkdf2_sha256’) # 创建django密码,第三个参数为加密算法
pwd_bool=check_password(pwd,mpwd) # 返回的是一个bool类型的值,验证密码正确与否

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

一个settings中的Password_hashers看起来是这样的:

PASSWORD_HASHERS = ( 
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)

具体的密码生成以及验证实现

from django.contrib.auth.hashers import make_password,check_password

pwd='4562154'
mpwd=make_password(pwd,None,'pbkdf2_sha256')  # 创建django密码,第三个参数为加密算法
pwd_bool=check_password(pwd,mpwd)  # 返回的是一个bool类型的值,验证密码正确与否


[外链图片转存中...(img-3WzLNtjp-1715567802645)]
[外链图片转存中...(img-RfoQDohB-1715567802645)]
[外链图片转存中...(img-UlouF04u-1715567802645)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django_celery_beat是一个django应用程序,它允许您使用celery定期运行周期性任务。这些周期性任务可以是一次性的或循环的,你可以设置它们在指定的时间间隔内自动运行,也可以设置它们在特定的时间运行。 要使用django_celery_beat,请按照以下步骤操作: 1. 安装django_celery_beat: ``` pip install django_celery_beat ``` 2. 在settings.py中添加以下代码: ``` INSTALLED_APPS = [ # ... 'django_celery_beat', ] CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` 3. 在项的urls.py文件中添加以下代码: ``` from django.urls import path from django_celery_beat.views import ( PeriodicTaskListView, PeriodicTaskCreateView, PeriodicTaskUpdateView, PeriodicTaskDeleteView, PeriodicTaskDetailView, ) urlpatterns = [ # ... path('celery/periodic-tasks/', PeriodicTaskListView.as_view(), name='periodic_task_list'), path('celery/periodic-task/add/', PeriodicTaskCreateView.as_view(), name='periodic_task_create'), path('celery/periodic-task/<int:pk>/', PeriodicTaskDetailView.as_view(), name='periodic_task_detail'), path('celery/periodic-task/<int:pk>/update/', PeriodicTaskUpdateView.as_view(), name='periodic_task_update'), path('celery/periodic-task/<int:pk>/delete/', PeriodicTaskDeleteView.as_view(), name='periodic_task_delete'), ] ``` 4. 在celery.py文件中添加以下代码: ``` from celery import Celery from django.conf import settings app = Celery('my_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) ``` 5. 在tasks.py文件中创建您的任务,例如: ``` from celery import shared_task @shared_task def my_task(): # Do something here ``` 6. 创建周期性任务,您可以使用Django admin或创建它们的视图。 现在,您已经可以在django中使用celery定期运行周期性任务了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值