我想向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类似的功能?
我正在使用该方法来获取整个对象.
tableView.getSelectionModel().getSelectedItem()
Run Code Online (Sandbox Code Playgroud)
如何从单个单元格获取数据?
我的意思是像S20BJ9DZ300266一样串?
我是 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)
这一直在发生。谢谢你的帮助。
更新: …
假设我有一个 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_dt和end_dt来摆脱时区。我如何设置我的 pydantic 模型,使其生成没有时区的日期时间?
我的目标是从请求中提取一些信息并将其放入某些全局上下文中。我尝试的第一件事是执行此操作的中间件函数
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作为参数,它就会得到 - 它不会出现在 或args中kwargs。因此,如果您知道如何强制每个端点作为request参数,而不需要在每个端点函数中手动添加它 - 它也将被接受作为解决方案。 …
使用此代码我总是得到一个空文件。
我和它有什么关系?
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) 这个问题可能很愚蠢,但我只是想知道,有什么区别吗?
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) 我有这样的中间件
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 个请求。在这种情况下如何安全地读取请求正文?我只想记录请求参数。
我正在使用std::stringstream从std::string值中解析一些数据.
这段代码:
std::string str = "data1 data2 data3 \"quotated data\"";
std::stringstream ss(str);
Run Code Online (Sandbox Code Playgroud)
如果我使用,ss >> anotherStr;我会用空格分隔每个单词.
我不明白是否有一个选项可以让stringstream将引号中的数据作为单个字符串值读取?
我有烧瓶、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('<', '<').replace('>', '>')但它没有任何改变。
python ×6
fastapi ×4
java ×3
middleware ×2
pydantic ×2
c++ ×1
constructor ×1
ftp ×1
html ×1
http ×1
javafx ×1
jinja2 ×1
optimization ×1
starlette ×1
stringstream ×1
tableview ×1
wkhtmltopdf ×1