GVKun编程网logo

在 SAP Kyma 上部署一个 Go MSSQL API Endpoint(sap commit work and wait)

1

如果您对在SAPKyma上部署一个GoMSSQLAPIEndpoint和sapcommitworkandwait感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解在SAPKyma上部署一个GoMS

如果您对在 SAP Kyma 上部署一个 Go MSSQL API Endpointsap commit work and wait感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解在 SAP Kyma 上部署一个 Go MSSQL API Endpoint的各种细节,并对sap commit work and wait进行深入的分析,此外还有关于connect SAP Hybris Enterprise Commerce Platform to SAP Kyma、EventBus in SAP UI5 and Kyma、Flask 之 endpoint 错误 View function mapping is overwriting an existing endpoint function: ***、IdentityServer4专题之四:Authorization Endpoint、Token Endpoint、scope、Access Token和Refresh Token、授权服务器发生错误的实用技巧。

本文目录一览:

在 SAP Kyma 上部署一个 Go MSSQL API Endpoint(sap commit work and wait)

在 SAP Kyma 上部署一个 Go MSSQL API Endpoint(sap commit work and wait)

在多模态模型的架构上,ChatGPT 的绘图能力主要依赖以下几个核心组件:

  1. 跨模态编码器(Cross-Modal Encoder)

    • 跨模态编码器的作用是将文本和图像的特征进行对齐。GPT 可以将用户输入的文本描述转换为文本特征表示,然后利用跨模态编码器将这些特征映射到图像特征空间。这种方式确保模型能够理解描述性语言中不同细节是如何与图像特征对应的。

connect SAP Hybris Enterprise Commerce Platform to SAP Kyma

connect SAP Hybris Enterprise Commerce Platform to SAP Kyma

从Hybris ECP暴露的service:

所有的API列表:

这个service instance分别绑定到了两个应用上:

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

本文同步分享在 博客“汪子熙”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

EventBus in SAP UI5 and Kyma

EventBus in SAP UI5 and Kyma

SAP UI5

EventBus是一个小型的subscribe/publish模式实现,位于namespace sap.ui.core下面。
subscribe:

publish:

消息订阅:

消息发布:

Kyma

Kyma Event Bus receives Events from external solutions and triggers the business logic created with lambda functions and services in Kyma. The Event Bus is based on the NATS Streamingopen source messaging system for cloud-native applications.

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

本文分享 CSDN - 汪子熙。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Flask 之 endpoint 错误 View function mapping is overwriting an existing endpoint function: ***

Flask 之 endpoint 错误 View function mapping is overwriting an existing endpoint function: ***

 

最近在学习 Flask, 其中遇到了一个错误,发现这个问题和 Flask, 路由有关系,所以就记了下来

 

错误代码:

from flask import Flask, render_template, request, redirect, session

app = Flask(__name__)
app.secret_key = "wang"


def confirm(func):  # 负责确认用户有没有登陆的装饰器
    def inner(*args, **kwargs):
        if session.get("auth"):  # 判断用户的session中没有user
            return func(*args, **kwargs)  # 通过
        else:  # 跳转登陆页面, 并携带当前访问的url
            next_url = request.path
            return redirect(f''/login?next={next_url}'')

    return inner


@app.route(''/'')
@confirm
def index():
    return "index"


@app.route(''/login'', methods=["GET", "POST"])
def login():
    msg = ''''
    if request.method == "POST":
        auth = request.form.get(''auth'')
        if auth == ''wang'':  # 简单认证
            session[''auth''] = auth  # 设置session
            next_url = request.args.get(''next_url'', "/")  # 获取用户之前访问的url, 进行跳转
            return redirect(next_url)
        else:
            msg = "口令错误"
    return render_template("login.html", msg=msg)


@app.route(''/shopping'')
@confirm
def shopping():
    return "购物"


if __name__ == ''__main__'':
    app.run(debug=True)

 

报错:

诡异的是,我不启动 flask, 只是解释一遍,也会报错

 

报错分析

分析报错提示

根据报错的提示,说我的代码存在重复的函数,然后就开始检查我的函数,发现函数名并没有重复,难道就这样排除函数名的嫌疑吗?NONONO

可能是我对装饰器的理解还不够,找了好半天才发现这个问题,原来是装饰器的原因,为什么呢?

 

为什么说是因为装饰器,才会出现函数覆盖的问题?

再来温习一下装饰器

def test(func):  # 装饰器
    """
    test
    :param func: 其实就是要装饰的函数
    :return:
    """

    def inner(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        end = time.time()
        return end - start

    return inner


def outer(a, b):  # 被装饰的函数
    for n in range(a):
        for j in range(b):
            a = n + j


outer = test(outer)  # 这里因为使用语法糖, 这种方式更能表示出问题
# 在这一步可以说对outer进行了重新的赋值,
# 现在outer就等于test这个函数的返回值, 并且将原本的outer传了进去
# test函数的返回值是一个inner
# 在inner函数中就包括了原本的outer, 并且这个outer在inner函数中是加了括号的
# 也就是说, 当inner被调用的时候, 原本的outer也会被调用
# 刚刚说test函数返回的是inner函数
# 当outer = test(outer)执行完之后, 新的outer就等于inner了
# 到这只需要知道现在的outer一样不是原来的outer了, 而是指向了inner, 在inner内部调用原来的outer


print(outer(100000, 200))  # 这是调用函数, 不能改变这个调用方式

 

再来看 flask 中 app.route 中的源码

 flask 使用装饰器来绑定一个 url 和视图的关系,带着遇到的问题来看看源码中做了些什么

@app.route(''/shopping'')     ①
@confirm
def shopping():
    return "购物"

def route(self, rule, **options):
    def decorator(f):
        endpoint = options.pop(''endpoint'', None)  # ② 从参数中弹出endpoint, 没有的话就是None
        self.add_url_rule(rule, endpoint, f, **options) #
        return f
        
@setupmethod
    def add_url_rule(self, rule, endpoint=None, view_func=None,
                     provide_automatic_options=None, **options):
                     
        if endpoint is None:  # ④ endpoint如果为None
            endpoint = _endpoint_from_view_func(view_func)  # ⑤ 将试图视图函数传了进去, 返回视图函数的__name__

def _endpoint_from_view_func(view_func):
    assert view_func is not None, ''expected view func if endpoint is not provided.''
    ~~~~ 其实执行的就是 inner.__name__, 因为此时的shopping, 已经不是原来的shopping, 而是装饰器内部返回的函数
    return view_func.__name__  # ⑥ 因为没有定义endpoint, 所以在返回视图函数的名字

看上面的代码应该就知道是哪里重复了,原因就是,都是调用了 inner.__name__, 所以拿到的 endpoint 值都是一样的才会提示重复了函数名

就是源码中的这一段抛出的异常

if view_func is not None:
            old_func = self.view_functions.get(endpoint)
            if old_func is not None and old_func != view_func:
                raise AssertionError(''View function mapping is overwriting an ''
                                     ''existing endpoint function: %s'' % endpoint)
            self.view_functions[endpoint] = view_func

 

如何解决这个问题

方法一

根据源码可以看看出是因为,endpoint 重复才导致的,当 endpoint 为 None 时,就会调用 inner.__name__, 就会导致重复,那么我们不让 endpoint 为空,那就不会调用 inner.__name__了

也就不会出现重复的问题了.

现在来看看在哪里可以定义这个 endpoint.

还记得源码中是从哪里去 endpoint 的吗,是不是下面这里

endpoint = options.pop(''endpoint'', None)

是从 option 中 pop 出去的,option 就是 route (self, rule, **options) 的一个形参,也就是说你在使用 app.route 的时候可以传一个 endpoint 的键值对

只需要对两个视图的 route 装饰器添加一个参数即可,看代码吧,红色部分是新添加的

@app.route(''/'', endpoint="index")
@confirm
def index():
    return "index"

@app.route(''/shopping'', endpoint="shopping")
@confirm
def shopping():
    return "购物"

这样既可以了,不信你试试

 

方法二

使用 functools.wraps

不太推荐这种方法,因为 flask 本身的不稳定性,所以要尽可能的少用第三方的模块,下面只提供了代码

def confirm(func, *args, **kwargs):
    @wraps(func)
    def inner():
        if session.get(''user''):
            return func(*args, **kwargs)
        else:
            next_url= request.path
            return redirect(''/login?next=%s'' % (next_url,))

    return inner

 

IdentityServer4专题之四:Authorization Endpoint、Token Endpoint、scope、Access Token和Refresh Token、授权服务器发生错误

IdentityServer4专题之四:Authorization Endpoint、Token Endpoint、scope、Access Token和Refresh Token、授权服务器发生错误

1.Authorization Endpoint

它是与用户交互的端点,用户在此进行为客户端应用授权的操作,即authorization grant

2.Token Endpoint

端点,就是一个web服务,一个路径,一个uri。客户端应用向Token端点展示它的权限,即展示authrization grant或者refresh token,来获取access token.除了implicit这种模式(直接向其发送access token),其它几种模式都需要向token端点处获取access toke。

 

3.scope 

它代表资源所有者在被保护资源那里的一些权限,因此可以将被保护资源分成不同的scope,这样不同的用户就可以拥有不同的权限,例如可以将一套的api划分为一个权限范围,也可以将读或写的api单独划分为一个scope。

4.Access Token

 有时候就叫token,是访问被保护资源的凭据,由一个字符串构成。它代表了给客户端颁发的授权,也就是委托给客户端的权限。oauth2.0并未定义其格式,但要求它描述出被授权访问的资源范围及其持续时间,即scope及其有效期。由授权服务器来颁发这个access token。客户端应用将这个access token展示给被保护资源,被保护资源需要验证此token。

5.Refresh Token 

它是用来获取access token的凭据,这也是由授权服务器颁发的。它不会发放到被保护资源,当access token要过期时,客户端通过此refresh token发往授权服务器获得新的access token。但当授权服务器接收到此refresh token,是只返回access token还是再次返回access token和一个refresh token,都是可以的。它具备让客户端应用逐渐降低访问权限的能力。

 

6.授权服务器发生错误

error,肯定会返回,它代表错误的类型

error_description

error_uri,更详细的错误描述

state,是请求中的state。

根据访问端点的不同,返回的错误信息的形式也不一样。授权端点是以query string的形式返回错误信息,而令牌端点是以post的bad中返回的,将错误字段放到bad中,状态码可能是400\401\500。

可能返回的错误类型一共有六种,其中有五种错误的状态码都是400,只有invalid_client是401。

 

关于在 SAP Kyma 上部署一个 Go MSSQL API Endpointsap commit work and wait的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于connect SAP Hybris Enterprise Commerce Platform to SAP Kyma、EventBus in SAP UI5 and Kyma、Flask 之 endpoint 错误 View function mapping is overwriting an existing endpoint function: ***、IdentityServer4专题之四:Authorization Endpoint、Token Endpoint、scope、Access Token和Refresh Token、授权服务器发生错误的相关信息,请在本站寻找。

本文标签: