Vue.js应用程序部署中容易遇到的问题,以及关于celery和redis的使用方法的讨论

今天要做的事情

今天是关于使用vue.js部署应用时遇到的vue+express错误的解决方法,以及celery和redis的处理方式。

【Vue.js+Express】处理直接指定URL时的404错误。

只使用Vue-Router的history模式,URL直接指定或者浏览器刷新将无法进行页面跳转。

在我这里出现了这样的错误。

スクリーンショット 2021-02-23 9.50.53.png

这是由SPA机制引起的。

可以通过在服务器端添加配置来解决这个问题。嗯,虽然文件中已经有解释,但是…

参考链接:HTML5 历史模式

为了进行Heroku部署,可以通过添加server.js文件并使用express来启动应用程序的方法。
我打算以此为基础,进行历史模式的支持。

连接-历史API-回退

在公式中

我认为使用「connect-history-api-fallback」会很好!

因为TA说了,所以我想乖乖听从ww

所以,我需要安装这个。

npm install --save connect-history-api-fallback

并在server.js中声明使用connect-history-api-fallback插件。

以下是修改后的代码。


var history = require('connect-history-api-fallback');
const express = require('express')
const serveStatic = require('serve-static')
const path = require('path')
const app = express()
app.use(history());
app.use('/', serveStatic(path.join(__dirname, '/dist')))
const port = process.env.PORT || 8080
app.listen(port)

我主要添加的是

var history = require('connect-history-api-fallback');
app.use(history());

只需要这两行,然后按顺序排列!

我认为这个可以用在复制粘贴中。


背景任务 wù)

當在Facebook上登入時,自動檢索和顯示已發佈的內容。

任务队列

任务队列是什么?

任务队列是一个临时存储任务消息的地方。保存在任务队列中的任务消息会被任务处理服务按照条件逐个获取并处理。

taskqueue.png

Redis 简介

Redis是什么?

Redis是REmote DIctionary Server的缩写
Redis是一种键值对型的NoSQL数据库
Python有字典类型,而Redis就像是一种字典型的数据库。

让我们在Mac上安装Redis吧。

安装Redis:使用brew install redis

立即尝试使用Redis吧!

连接到Redis

使用redis-cli命令进行连接。

$ redis-cli
127.0.0.1:6379>

数据的录入、获取和删除

$ redis-cli
127.0.0.1:6379> set Key Value
OK
127.0.0.1:6379> get Key
"Value"
127.0.0.1:6379> del Key
(integer) 1
127.0.0.1:6379> get Key
(nil)
127.0.0.1:6379> Keys *
(empty list or set)

西芹

【Python】在本地环境中尝试运行Celery
这是有关作业队列框架Celery的使用方法。首先,我们将尝试在本地环境中运行它。

如果您方便的话,请根据文件的大致内容进行确认。

安装celery

使用pip安装最新版本的Celery。

安装 Redis

为了进行消息的发送和接收,Celery需要另外一个被称为消息代理的服务。

在经纪人中有RabbitMQ和Redis可供选择,这次我们选择使用Redis。

安装Redis,可以使用以下命令:`pip install redis`。

接下来需要修改 requirement 文件。

celery==3.5.3
redis==5.0.5

为了使用Celery在Django中进行准备工作。

为了在django中使用celery

    1. 添加celery文件,并编写任务

 

    1. 在__init__.py中输入命令

 

    1. 在后台设置redis

 

    1. 启动Celery Worker Server

 

    调用任务

我正在参考官方文件。

添加celery文件,并编写任务

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main.settings')

app = Celery('main')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

在__init__.py文件中输入命令

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

3. 设置阻止者

公式文件在这里。

CELERY_BROKER_URL='redis://localhost'

加上这个

由于准备工作已经完成,我们可以进入下一个阶段了。

启动Celery Worker服务器。

启动执行任务的工作人员。

celery -A main worker -l INFO

在正式环境中,为了将工作程序作为守护进程使用,需要使用各个平台提供的工具。

调用任务


@app.task(bind=True)
def hello(self):
    print('hello')
>>> from main.celery import hello
>>> hello.delay()

你好函數進入到Celery的任務工作器中並且被執行。

如果想处理多个任务,请创建一个 tasks.py 文件。

任务.py

在后台执行显示账户的 first_name 的处理

from celery import shared_task
from core.models import Account 

@shared_task
def print_account_name(acccount_id):
    account = Account.objects.filter(id=account_id).first()

    print(account.user.first_name)

让我们亲自在Django的serializers.py中写入一些代码,看看实际效果。

首先,将处理内容写入tasks.py文件中。

@shared_task
def get_fb_post(account_id):
    pass

接下来,编写一段代码将tasks.py添加到serializers中以进行执行。

                #userのfb_id
                user = User(username=str(uuid.uuid4()))
                user.first_name = profile['first_name']
                user.last_name = profile['last_name']
                user.email = profile.get('email', '')
                user.save()
                account = Account()
                account.user = user
                account.fb_id = profile['id']
                account.fb_token = fb_token
                account.save()
     #get_fb_post関数を実行する
                get_fb_post.delay(account.id)
                return account

今天的任务:

在tasks.py文件中编写获取Facebook帖子的过程。

广告
将在 10 秒后关闭
bannerAds