diff --git a/Dockerfile b/Dockerfile index 2e36450..33fade1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,27 @@ -# nginx-gunicorn-flask +FROM python:3.11-alpine AS build -FROM ubuntu:latest -MAINTAINER Hiller Liao +WORKDIR /app -ENV DEBIAN_FRONTEND noninteractive +COPY requirements.txt ./ +RUN pip install -r requirements.txt -RUN apt-get update -RUN apt-get install -y python3 python3-pip python3-virtualenv nginx supervisor - -# Setup flask application -RUN mkdir -p /app -COPY . /app -RUN pip install -r /app/requirements.txt -i https://mirrors.aliyun.com/pypi/simple +COPY . . RUN pip install gunicorn -# RUN pip install git+https://github.com/getsyncr/notion-sdk.git -# Setup nginx -RUN rm /etc/nginx/sites-enabled/default -COPY flask.conf /etc/nginx/sites-available/ -RUN ln -s /etc/nginx/sites-available/flask.conf /etc/nginx/sites-enabled/flask.conf -RUN echo "daemon off;" >> /etc/nginx/nginx.conf +FROM python:3.11-alpine AS runtime + +WORKDIR /app + +# 复制并安装gunicorn +COPY --from=build /app/requirements.txt . +RUN pip install -r requirements.txt +RUN pip install Flask-Caching + +# 复制应用代码 +COPY --from=build /app . -# Setup supervisord -RUN mkdir -p /var/log/supervisor -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY gunicorn.conf /etc/supervisor/conf.d/gunicorn.conf +# 设置用户和端口 +USER 1000:1000 +EXPOSE 5000 -# Start processes -CMD ["/usr/bin/supervisord"] +ENTRYPOINT ["gunicorn", "-w", "4", "-b", ":5000", "main:app"] diff --git a/rsshub/blueprints/main.py b/rsshub/blueprints/main.py index cdcc2f8..2fa116a 100644 --- a/rsshub/blueprints/main.py +++ b/rsshub/blueprints/main.py @@ -21,17 +21,21 @@ def feeds(): @bp.app_template_global() def filter_content(ctx): - include_title = request.args.get('include_title') - include_description = request.args.get('include_description') - exclude_title = request.args.get('exclude_title') - exclude_description = request.args.get('exclude_description') - limit = request.args.get('limit', type=int) items = ctx['items'].copy() - items = [item for item in items if include_title in item['title']] if include_title else items - items = [item for item in items if include_description in item['description']] if include_description else items - items = [item for item in items if exclude_title not in item['title']] if exclude_title else items - items = [item for item in items if exclude_description not in item['description']] if exclude_description else items - items = items[:limit] if limit else items + if 'include_title' in request.args: + include_titles = request.args['include_title'].split('|') + items = [item for item in items if any(title in item['title'] for title in include_titles)] + if 'exclude_title' in request.args: + exclude_titles = request.args['exclude_title'].split('|') + items = [item for item in items if all(title not in item['title'] for title in exclude_titles)] + if 'include_description' in request.args: + include_description = request.args['include_description'].split('|') + items = [item for item in items if any(description in item['description'] for description in include_description)] + if 'exclude_description' in request.args: + exclude_description = request.args['exclude_description'].split('|') + items = [item for item in items if all(description not in item['description'] for description in exclude_description)] + if 'limit' in request.args: + items = items[:int(request.args['limit'])] ctx = ctx.copy() ctx['items'] = items return ctx @@ -320,4 +324,4 @@ def tadoku_books(category=''): def rss_filter(): from rsshub.spiders.rssfilter.filter import ctx feed_url = request.args.get("feed") - return render_template('main/atom.xml', **filter_content(ctx(feed_url))) \ No newline at end of file + return render_template('main/atom.xml', **filter_content(ctx(feed_url)))