小编sas*_*ero的帖子

如何向 FastAPI 路由添加自定义装饰器?

我想向auth_required我的端点添加一个装饰器。(请考虑这个问题是关于装饰器,而不是中间件

所以一个简单的装饰器看起来像这样:

def auth_required(func):
    def wrapper(*args, **kwargs):
        if user_ctx.get() is None:
            raise HTTPException(...)
        return func(*args, **kwargs)
    return wrapper
Run Code Online (Sandbox Code Playgroud)

所以有2种用法:

@auth_required
@router.post(...)
Run Code Online (Sandbox Code Playgroud)

或者

@router.post(...)
@auth_required
Run Code Online (Sandbox Code Playgroud)

第一种方法不起作用,因为router.post创建了一个保存到self.routesAPIRouter 对象中的路由器。第二种方法不起作用,因为它无法验证 pydantic 对象。对于任何请求模型,它说missing args, missing kwargs

所以我的问题是 - 如何向 FastAPI 端点添加任何装饰器?我应该进入router.routes并修改现有端点吗?或者使用一些functools.wraps类似的功能?

python python-decorators pydantic fastapi

8
推荐指数
3
解决办法
4851
查看次数

JavaFX TableView如何获取单元格的数据?

我正在使用该方法来获取整个对象.

tableView.getSelectionModel().getSelectedItem()
Run Code Online (Sandbox Code Playgroud)

如何从单个单元格获取数据? 在此输入图像描述
我的意思是像S20BJ9DZ300266一样串?

java javafx tableview

7
推荐指数
1
解决办法
3万
查看次数

没有名为 main 的模块,wkhtmltopdf 问题

我是 Python 新手,但我发现的所有搜索结果对我来说都没用。

    C:\Users\Aero>pip install wkhtmltopdf
Collecting wkhtmltopdf
  Using cached wkhtmltopdf-0.2.tar.gz
Installing collected packages: wkhtmltopdf
  Running setup.py install for wkhtmltopdf
Successfully installed wkhtmltopdf-0.2

C:\Users\Aero>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wkhtmltopdf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\lib\site-packages\wkhtmltopdf\__init__.py", line 1, in <module>
    from main import WKhtmlToPdf, wkhtmltopdf
ImportError: No module named 'main'
Run Code Online (Sandbox Code Playgroud)

这一直在发生。谢谢你的帮助。

更新: …

python wkhtmltopdf

6
推荐指数
2
解决办法
7834
查看次数

如何在Fast API中将unix时间戳解析为没有时区的日期时间

假设我有一个 pydantic 模型

class EventEditRequest(BaseModel):
    uid: UUID
    name: str
    start_dt: datetime
    end_dt: datetime
Run Code Online (Sandbox Code Playgroud)

我发送带有正文的请求b'{"uid":"a38a7543-20ca-4a50-ab4e-e6a3ae379d3c","name":"test event2222","start_dt":1600414328,"end_dt":1600450327}'

所以 和start_dt都是end_dtunix时间戳。但在端点中,它们变成带有时区的日期时间。

@app.put('...')
def edit_event(event_data: EventEditRequest):
    event_data.start_dt.tzinfo is not None  # True
Run Code Online (Sandbox Code Playgroud)

我不想在端点函数中手动编辑start_dtend_dt来摆脱时区。我如何设置我的 pydantic 模型,使其生成没有时区的日期时间?

python python-datetime pydantic fastapi

6
推荐指数
2
解决办法
8276
查看次数

FastAPI 保存将在端点中可用的上下文

我的目标是从请求中提取一些信息并将其放入某些全局上下文中。我尝试的第一件事是执行此操作的中间件函数

user_ctx: ContextVar[typing.Optional[UUID]] = ContextVar('user_ctx', default=None)

def save_user_ctx(request: Request):
    uid = ... # logic that extracts user uid from request header
    user_ctx.set(uid)
Run Code Online (Sandbox Code Playgroud)

例如,我将其添加到另一个中间件函数中my_middleware

所以它确实设置了上下文,但据我所知,中间件在另一个线程中工作,所以如果我尝试类似的事情

@router.post('/some_url', response_model=SomeResponseModel)
def some_url(data: SomeRequestModel, auth_checker = Depends(my_middleware)):
    user_ctx.get() # >> None
Run Code Online (Sandbox Code Playgroud)

auth_checker拥有所有身份验证信息,因此中间件可以正常工作。但uid = user_ctx.get()归来None

这只是一个例子。请

我想要实现的是将请求中的一些上下文存储在自动服务端点的线程中。我的意思是不写ctx.set(smth)为每个端点的第一行。

我也尝试过写装饰器

def save_request_ctx(func):
    @wraps(func)
    def wrap(*args, **kwargs):
        ctx.set(...)
        return func(*args, **kwargs)
    return wrap
Run Code Online (Sandbox Code Playgroud)

但是,如果端点没有request: Request作为参数,它就会得到 - 它不会出现在 或argskwargs。因此,如果您知道如何强制每个端点作为request参数,而不需要在每个端点函数中手动添加它 - 它也将被接受作为解决方案。 …

python middleware fastapi

6
推荐指数
1
解决办法
8422
查看次数

如何使用Java从FTP下载文件?

使用此代码我总是得到一个空文件。
我和它有什么关系?
login总是true。(ofc,这里不是真实密码)

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

import java.io.*;

public class Logs {
    public static void main(String[] args) {
        FTPClient client = new FTPClient();

        try {
            client.connect("myac.cs-server.pro", 121);
            boolean login = client.login("a3ro", "passWordIsSecret");
            System.out.println(login);
            String remoteFile1 = "myac_20150304.log";
            File downloadFile1 = new File("C:\\Users\\Aero\\Desktop\\test\\myac.log");
            OutputStream outputStream1 =
                new BufferedOutputStream(new FileOutputStream(downloadFile1));
            boolean success = client.retrieveFile(remoteFile1, outputStream1);
            System.out.println(success);
            outputStream1.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                client.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java ftp apache-commons-net

5
推荐指数
2
解决办法
2万
查看次数

哪种设置字段值更好,为什么?

这个问题可能很愚蠢,但我只是想知道,有什么区别吗?

class A{
    // common code
    private int field;
    public void setField(int field){
         this.field = field;
    }

    //way 1
    public A(int field){
        this.field = field;
    }

    //way 2
    public A(int field){
        setField(field);
    }
}
Run Code Online (Sandbox Code Playgroud)

java optimization constructor

5
推荐指数
1
解决办法
84
查看次数

在中间件上下文中获取 starlette 请求正文

我有这样的中间件

class RequestContext(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next: RequestResponseEndpoint):
        request_id = request_ctx.set(str(uuid4()))  # generate uuid to request
        body = await request.body()
        if body:
            logger.info(...)  # log request with body
        else:
            logger.info(...)  # log request without body
 
        response = await call_next(request)
        response.headers['X-Request-ID'] = request_ctx.get()
        logger.info("%s" % (response.status_code))
        request_ctx.reset(request_id)

        return response
Run Code Online (Sandbox Code Playgroud)

因此该行body = await request.body()冻结了所有具有正文的请求,而我从所有请求中获得了 504 个请求。在这种情况下如何安全地读取请求正文?我只想记录请求参数。

python middleware http starlette fastapi

5
推荐指数
1
解决办法
3341
查看次数

如何询问stringstream不要用引号分割数据(C++)

我正在使用std::stringstreamstd::string值中解析一些数据.
这段代码:

std::string str = "data1 data2 data3 \"quotated data\"";
std::stringstream ss(str);
Run Code Online (Sandbox Code Playgroud)

如果我使用,ss >> anotherStr;我会用空格分隔每个单词.
我不明白是否有一个选项可以让stringstream将引号中的数据作为单个字符串值读取?

c++ stringstream

4
推荐指数
1
解决办法
293
查看次数

如何避免使用 Jinja2 自动转义 HTML 标签

我有烧瓶、jinja2 和 python。
所以,我试图显示存储为 Markdown 的文本。
我这样做

class Article(db.Entity):
...

    def html(self):
        return markdown(self.text) # from markdown import markdown
Run Code Online (Sandbox Code Playgroud)

接下来我认为我这样做

html_text = article_.html()    
return render_template('article.html', article=article_, comments=comments, user=user, text=html_text)
Run Code Online (Sandbox Code Playgroud)

在 article.html 我只有这一行

{{text}}
Run Code Online (Sandbox Code Playgroud)

因此,数据存储在 db 中,就像*im busy*<p><em>im busy</em></p>在浏览器中一样。我尝试使用.replace('&lt;', '<').replace('&gt;', '>')但它没有任何改变。

html python jinja2

4
推荐指数
1
解决办法
2500
查看次数