Python parse.urlunparse方法代码示例

本文整理汇总了Python中urllib.parse.urlunparse方法的典型用法代码示例。如果您正苦于以下问题:Python parse.urlunparse方法的具体用法?Python parse.urlunparse怎么用?Python parse.urlunparse使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在模块urllib.parse的用法示例。

在下文中一共展示了parse.urlunparse方法的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。

示例1: validate_link

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def validate_link(self, link, bookmark=False):
        """Checks if the given link can get correct data."""
        # removes the scheme and net location parts of the link
        url_parts = list(urlparse.urlparse(link))
        url_parts[0] = url_parts[1] = ''
        # bookmark link should not have the version in the URL
        if bookmark and url_parts[2].startswith(PATH_PREFIX):
            return False
        full_path = urlparse.urlunparse(url_parts)
        try:
            self.get_json(full_path, path_prefix='')
            return True
        except Exception:
            return False 
开发者ID:openstack,项目名称:zun,代码行数:18,代码来源:base.py


示例2: do_GET

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def do_GET(self):
        (scm, netloc, path, params, query, fragment) = urlparse(self.path, "http")
        if scm != "http" or fragment or not netloc:
            self.send_error(400, "bad url %s" % self.path)
            return
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            if self._connect_to(netloc, soc):
                self.log_request()
                soc.send(
                    "%s %s %s\r\n" % (self.command, urlunparse(("", "", path, params, query, "")), self.request_version)
                )
                self.headers["Connection"] = "close"
                del self.headers["Proxy-Connection"]
                for key_val in self.headers.items():
                    soc.send("%s: %s\r\n" % key_val)
                soc.send("\r\n")
                self._read_write(soc)
        finally:
            logging.warning("Finished do_GET()")
            soc.close()
            self.connection.close() 
开发者ID:nabla-c0d3,项目名称:sslyze,代码行数:24,代码来源:tiny_proxy.py


示例3: urlparams

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def urlparams(url, fragment=None, **kwargs):
    """
    Add a fragment and/or query parameters to a URL.
    Existing query string parameters are preserved, unless they conflict
    with the new parameters, in which case they're overridden.
    """
    parsed = urlparse(url)
    query = dict(parse_qs(parsed.query), **kwargs)
    return urlunparse(
        (
            parsed.scheme,
            parsed.netloc,
            parsed.path,
            parsed.params,
            urlencode(query, doseq=True),
            fragment if fragment is not None else parsed.fragment,
        )
    ) 
开发者ID:mozilla,项目名称:normandy,代码行数:21,代码来源:utils.py


示例4: make_next_param

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def make_next_param(login_url, current_url):
    '''
    Reduces the scheme and host from a given URL so it can be passed to
    the given `login` URL more efficiently.
    :param login_url: The login URL being redirected to.
    :type login_url: str
    :param current_url: The URL to reduce.
    :type current_url: str
    '''
    l = urlparse(login_url)
    c = urlparse(current_url)
    if (not l.scheme or l.scheme == c.scheme) and \
            (not l.netloc or l.netloc == c.netloc):
        return urlunparse(('', '', c.path, c.params, c.query, ''))
    return current_url 
开发者ID:jpush,项目名称:jbox,代码行数:19,代码来源:flask_login.py


示例5: get_local_uri

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_local_uri(self, uri):
        """
        Convert a remote uri to a local one.
        This method takes a remote service uri accessible to the remote host and
        returns a local uri accessible directly on the local host, establishing
        any necessary port forwarding in the process.
        Args:
            uri (str): The remote uri to be made local.
        Returns:
            str: A local uri that tunnels all traffic to the remote host.
        """
        parsed_uri = urlparse(uri)
        return urlunparse(parsed_uri._replace(netloc='localhost:{}'.format(self.port_forward(parsed_uri.netloc)))) 
开发者ID:airbnb,项目名称:omniduct,代码行数:18,代码来源:base.py


示例6: get_redirect_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_redirect_url(request):
    """Redirects to referring page, or CAS_REDIRECT_URL if no referrer is
    set.
    """
    next_ = request.GET.get(REDIRECT_FIELD_NAME)
    if not next_:
        redirect_url = resolve_url(django_settings.CAS_REDIRECT_URL)
        if django_settings.CAS_IGNORE_REFERER:
            next_ = redirect_url
        else:
            next_ = request.META.get('HTTP_REFERER', redirect_url)
        prefix = urllib_parse.urlunparse(
            (get_protocol(request), request.get_host(), '', '', '', ''),
        )
        if next_.startswith(prefix):
            next_ = next_[len(prefix):]
    return next_ 
开发者ID:django-cas-ng,项目名称:django-cas-ng,代码行数:20,代码来源:utils.py


示例7: get_service_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_service_url(request, redirect_to=None):
    """Generates application django service URL for CAS"""
    if hasattr(django_settings, 'CAS_ROOT_PROXIED_AS'):
        service = django_settings.CAS_ROOT_PROXIED_AS + request.path
    else:
        if django_settings.CAS_FORCE_SSL_SERVICE_URL:
            protocol = 'https'
        else:
            protocol = get_protocol(request)
        host = request.get_host()
        service = urllib_parse.urlunparse(
            (protocol, host, request.path, '', '', ''),
        )
    if not django_settings.CAS_STORE_NEXT:
        if '?' in service:
            service += '&'
        else:
            service += '?'
        service += urllib_parse.urlencode({
            REDIRECT_FIELD_NAME: redirect_to or get_redirect_url(request)
        })
    return service 
开发者ID:django-cas-ng,项目名称:django-cas-ng,代码行数:24,代码来源:utils.py


示例8: _scripts

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def _scripts(self):
        url_parts = urlparse(self._base or self._url)
        scheme = url_parts.scheme
        for tag in self.soup.find_all("script", src=True):
            parts = urlparse(tag["src"])
            if parts.scheme:
                if parts.netloc:
                    # Full absolute URL
                    script_url = urlunparse((parts.scheme, parts.netloc, parts.path, parts.params, parts.query, ''))
                else:
                    # Malformed absolute URL (no host)
                    continue
            elif parts.netloc:
                # Protocol relative URL
                script_url = urlunparse((scheme, parts.netloc, parts.path, parts.params, parts.query, ''))
            else:
                # Internal relative URL
                script_url = urlunparse(('', '', parts.path, parts.params, parts.query, ''))
            yield script_url 
开发者ID:penetrate2hack,项目名称:ITWSV,代码行数:23,代码来源:crawler.py


示例9: set_proxy

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def set_proxy(self, proxy=""):
        """Set a proxy to use for HTTP requests."""
        url_parts = urlparse(proxy)
        protocol = url_parts.scheme.lower()
        if protocol in ("http", "https", "socks"):
            if protocol == "socks":
                # socks5h proxy type won't leak DNS requests
                proxy = urlunparse(("socks5h", url_parts.netloc, '/', '', '', ''))
            else:
                proxy = urlunparse((url_parts.scheme, url_parts.netloc, '/', '', '', ''))
            # attach the proxy for http and https URLs
            self._session.proxies["http"] = proxy
            self._session.proxies["https"] = proxy
        else:
            raise ValueError("Unknown proxy type '{}'".format(protocol)) 
开发者ID:penetrate2hack,项目名称:ITWSV,代码行数:19,代码来源:crawler.py


示例10: redirect_to_login

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
    """
    Redirect the user to the login page, passing the given 'next' page.
    """
    resolved_url = resolve_url(login_url or settings.LOGIN_URL)
    login_url_parts = list(urlparse(resolved_url))
    if redirect_field_name:
        querystring = QueryDict(login_url_parts[4], mutable=True)
        querystring[redirect_field_name] = next
        login_url_parts[4] = querystring.urlencode(safe='/')
    return HttpResponseRedirect(urlunparse(login_url_parts))
# 4 views for password reset:
# - password_reset sends the mail
# - password_reset_done shows a success message for the above
# - password_reset_confirm checks the link the user clicked and
#   prompts for a new password
# - password_reset_complete shows a success message for the above 
开发者ID:reBiocoder,项目名称:bioforum,代码行数:23,代码来源:views.py


示例11: _BuildUrl

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def _BuildUrl(self, url, path_elements=None, extra_params=None):
        # Break url into constituent parts
        (scheme, netloc, path, params, query, fragment) = urlparse(url)
        # Add any additional path elements to the path
        if path_elements:
            # Filter out the path elements that have a value of None
            p = [i for i in path_elements if i]
            if not path.endswith('/'):
                path += '/'
            path += '/'.join(p)
        # Add any additional query parameters to the query string
        if extra_params and len(extra_params) > 0:
            extra_query = self._EncodeParameters(extra_params)
            # Add it to the existing query
            if query:
                query += '&' + extra_query
            else:
                query = extra_query
        # Return the rebuilt URL
        return urlunparse((scheme, netloc, path, params, query, fragment)) 
开发者ID:doncat99,项目名称:StockRecommendSystem,代码行数:25,代码来源:api.py


示例12: redirect_to_sudo

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def redirect_to_sudo(next_url, sudo_url=None):
    """
    Redirects the user to the login page, passing the given 'next' page
    """
    if sudo_url is None:
        sudo_url = URL
    try:
        # django 1.10 and greater can't resolve the string 'sudo.views.sudo' to a URL
        # https://docs.djangoproject.com/en/1.10/releases/1.10/#removed-features-1-10
        sudo_url = import_string(sudo_url)
    except (ImportError, ImproperlyConfigured):
        pass  # wasn't a dotted path
    sudo_url_parts = list(urlparse(resolve_url(sudo_url)))
    querystring = QueryDict(sudo_url_parts[4], mutable=True)
    querystring[REDIRECT_FIELD_NAME] = next_url
    sudo_url_parts[4] = querystring.urlencode(safe="/")
    return HttpResponseRedirect(urlunparse(sudo_url_parts)) 
开发者ID:mattrobenolt,项目名称:django-sudo,代码行数:23,代码来源:views.py


示例13: add_params

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def add_params(url, extra=None, remove=None):
    """Given a URL, add new query parameters by merging in the contents of the
    `extra` dictionary.
    :param url: (str)
    :param extra: (dict)
    :param remove: (list or set)
    :returns: (str) URL including new parameters
    """
    if not (extra or remove):
        return url
    parsed = parse.urlparse(url)._asdict()
    params = parse.parse_qsl(parsed["query"])
    if extra:
        params += list(extra.items())
    if remove:
        params = [pair for pair in params if pair[0] not in remove]
    parsed["query"] = parse.urlencode(params, doseq=True)
    return parse.urlunparse(parse.ParseResult(**parsed)) 
开发者ID:codeforboston,项目名称:cornerwise,代码行数:26,代码来源:utils.py


示例14: get_events_list

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_events_list():
        page_index_url = Events.host + 'index.php'
        url_parts = list(urlparse.urlparse(page_index_url))
        events_links, events_dates = [], []
        paging_index = 1
        events_count = 10
        while events_count == 10:
            params = {
                'p': paging_index
            }
            url_parts[4] = urlencode(params)
            paging_index += 1
            html = Scraper.get(urlparse.urlunparse(url_parts))
            soup = BeautifulSoup(html, 'html.parser')
            events_dom_arr = soup.select('#results')[0].find_all('li')
            events_count = len(events_dom_arr)
            events_links += list(map(lambda e: e.a['href'], events_dom_arr))
            events_dates += list(map(lambda e: e.find('p').text.split(' : ')[1].split(', ')[0], events_dom_arr))
        return zip(events_links, events_dates) 
开发者ID:cobalt-uoft,项目名称:uoft-scrapers,代码行数:23,代码来源:__init__.py


示例15: get_logo_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_logo_url(base_url, logo_file):
    base_url = parse.urlparse(base_url)
    netloc = base_url.netloc
    if base_url.netloc.startswith('localhost'):
        netloc = 'notify.tools'
    elif base_url.netloc.startswith('www'):
        # strip "www."
        netloc = base_url.netloc[4:]
    logo_url = parse.ParseResult(
        scheme=base_url.scheme,
        netloc='static-logos.' + netloc,
        path=logo_file,
        params=base_url.params,
        query=base_url.query,
        fragment=base_url.fragment
    )
    return parse.urlunparse(logo_url) 
开发者ID:alphagov,项目名称:notifications-api,代码行数:21,代码来源:send_to_providers.py


示例16: get_version_files

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_version_files(cls, version):
        parsed_version_path = urlparse(version)
        content_list = cls.s3_list_content(version)
        xml_pattern = re.compile(
            parsed_version_path.path[1:-1] + r'/[^/]+\.xml$')
        bin_pattern = re.compile(
            parsed_version_path.path[1:-1] + r'/[^/]+\.bin$')
        xml_file = list(filter(xml_pattern.match, content_list))
        bin_file = list(filter(bin_pattern.match, content_list))
        if len(xml_file) != 0 and len(bin_file) != 0:
            if os.path.splitext(xml_file[0])[0] == \
                    os.path.splitext(bin_file[0])[0]:
                xml_file[0] = urlunparse(
                    (parsed_version_path.scheme, parsed_version_path.netloc,
                     xml_file[0], parsed_version_path.params,
                     parsed_version_path.query, parsed_version_path.fragment))
                bin_file[0] = urlunparse(
                    (parsed_version_path.scheme, parsed_version_path.netloc,
                     bin_file[0], parsed_version_path.params,
                     parsed_version_path.query, parsed_version_path.fragment))
                mapping_config = cls._get_mapping_config(version)
                return xml_file[0], bin_file[0], mapping_config
        return None, None, None 
开发者ID:openvinotoolkit,项目名称:model_server,代码行数:25,代码来源:s3_model.py


示例17: get_version_files

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_version_files(cls, version):
        parsed_version_path = urlparse(version)
        content_list = cls.gs_list_content(version)
        xml_pattern = re.compile(
            parsed_version_path.path[1:-1] + r'/[^/]+\.xml$')
        bin_pattern = re.compile(
            parsed_version_path.path[1:-1] + r'/[^/]+\.bin$')
        xml_file = list(filter(xml_pattern.match, content_list))
        bin_file = list(filter(bin_pattern.match, content_list))
        if len(xml_file) != 0 and len(bin_file) != 0:
            if os.path.splitext(xml_file[0])[0] == \
                    os.path.splitext(bin_file[0])[0]:
                xml_file[0] = urlunparse(
                    (parsed_version_path.scheme, parsed_version_path.netloc,
                     xml_file[0], parsed_version_path.params,
                     parsed_version_path.query, parsed_version_path.fragment))
                bin_file[0] = urlunparse(
                    (parsed_version_path.scheme, parsed_version_path.netloc,
                     bin_file[0], parsed_version_path.params,
                     parsed_version_path.query, parsed_version_path.fragment))
                mapping_config = cls._get_mapping_config(version)
                return xml_file[0], bin_file[0], mapping_config
        return None, None, None 
开发者ID:openvinotoolkit,项目名称:model_server,代码行数:25,代码来源:gs_model.py


示例18: base_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def base_url(self) -> str:
        """Returns the base url without query string or fragments."""
        return urlunparse(ParseResult(self.scheme, self.host, self.path, "", "", "")) 
开发者ID:pgjones,项目名称:quart,代码行数:5,代码来源:base.py


示例19: host_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def host_url(self) -> str:
        return urlunparse(ParseResult(self.scheme, self.host, "", "", "", "")) 
开发者ID:pgjones,项目名称:quart,代码行数:4,代码来源:base.py


示例20: url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def url(self) -> str:
        """Returns the full url requested."""
        return urlunparse(
            ParseResult(
                self.scheme, self.host, self.path, "", self.query_string.decode("ascii"), ""
            )
        ) 
开发者ID:pgjones,项目名称:quart,代码行数:9,代码来源:base.py


示例21: url_root

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def url_root(self) -> str:
        return urlunparse(
            ParseResult(self.scheme, self.host, self.path.rsplit("/", 1)[0] + "/", "", "", "")
        ) 
开发者ID:pgjones,项目名称:quart,代码行数:6,代码来源:base.py


示例22: _parse

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def _parse(application_endpoint: str) -> Tuple[str, str, str]:
        url, valid = LuisApplication._try_parse_url(application_endpoint)
        if not valid:
            raise ValueError(
                f"{application_endpoint} is not a valid LUIS application endpoint."
            )
        segments = PurePosixPath(unquote(url.path)).parts
        application_id = segments[-1] if segments else None
        qs_parsed_result = parse_qs(url.query)
        endpoint_key = qs_parsed_result.get("subscription-key", [None])[0]
        parts_for_base_url = url.scheme, url.netloc, "", None, None, None
        endpoint = urlunparse(parts_for_base_url)
        return (application_id, endpoint_key, endpoint) 
开发者ID:microsoft,项目名称:botbuilder-python,代码行数:17,代码来源:luis_application.py


示例23: url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def url(self):
        return urlunparse(
            (self.scheme, self.host, self.path, None, self.query_string, None)
        ) 
开发者ID:huge-success,项目名称:sanic,代码行数:6,代码来源:request.py


示例24: process_redirect_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def process_redirect_url(redirect_url, new_entries):
  # Prepare the redirect URL
  url_parts = list(urlparse.urlparse(redirect_url))
  queries = dict(urlparse.parse_qsl(url_parts[4]))
  queries.update(new_entries)
  url_parts[4] = urlencode(queries)
  url = urlparse.urlunparse(url_parts)
  return url 
开发者ID:michaelawyu,项目名称:auth-server-sample,代码行数:10,代码来源:Implicit_auth_server.py


示例25: process_redirect_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def process_redirect_url(redirect_url, authorization_code):
  # Prepare the redirect URL
  url_parts = list(urlparse.urlparse(redirect_url))
  queries = dict(urlparse.parse_qsl(url_parts[4]))
  queries.update({ "authorization_code": authorization_code })
  url_parts[4] = urlencode(queries)
  url = urlparse.urlunparse(url_parts)
  return url 
开发者ID:michaelawyu,项目名称:auth-server-sample,代码行数:10,代码来源:AC_PKCE_auth_server.py


示例26: add_preserved_filters

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def add_preserved_filters(self, context, url, popup=False, to_field=None):
        opts = context.get('opts')
        preserved_filters = context.get('preserved_filters')
        parsed_url = list(urlparse(url))
        parsed_qs = dict(parse_qsl(parsed_url[4]))
        merged_qs = dict()
        if opts and preserved_filters:
            preserved_filters = dict(parse_qsl(preserved_filters))
            match_url = '/%s' % url.partition(get_script_prefix())[2]
            try:
                match = resolve(match_url)
            except Resolver404:
                pass
            else:
                current_url = '%s:%s' % (match.app_name, match.url_name)
                changelist_url = 'admin:%s_changelist' % self.get_base_viewname()
                if changelist_url == current_url and '_changelist_filters' in preserved_filters:
                    preserved_filters = dict(parse_qsl(preserved_filters['_changelist_filters']))
            merged_qs.update(preserved_filters)
        if popup:
            from django.contrib.admin.options import IS_POPUP_VAR
            merged_qs[IS_POPUP_VAR] = 1
        if to_field:
            from django.contrib.admin.options import TO_FIELD_VAR
            merged_qs[TO_FIELD_VAR] = to_field
        merged_qs.update(parsed_qs)
        parsed_url[4] = urlencode(merged_qs)
        return urlunparse(parsed_url) 
开发者ID:inueni,项目名称:django-subadmin,代码行数:37,代码来源:__init__.py


示例27: server_tcp_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def server_tcp_url(server, request):
    def make(**kwargs):
        netloc = '{0.host}:{0.port}'.format(server.tcp_address)
        path = ''
        if request.param == 'path':
            if 'password' in kwargs:
                netloc = ':{0}@{1.host}:{1.port}'.format(
                    kwargs.pop('password'), server.tcp_address)
            if 'db' in kwargs:
                path = '/{}'.format(kwargs.pop('db'))
        query = urlencode(kwargs)
        return urlunparse(('redis', netloc, path, '', query, ''))
    return make 
开发者ID:aio-libs,项目名称:aioredis,代码行数:16,代码来源:conftest.py


示例28: server_unix_url

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def server_unix_url(server):
    def make(**kwargs):
        query = urlencode(kwargs)
        return urlunparse(('unix', '', server.unixsocket, '', query, ''))
    return make
# Internal stuff # 
开发者ID:aio-libs,项目名称:aioredis,代码行数:10,代码来源:conftest.py


示例29: get_x5u

# 需要导入模块: from urllib import parse [as 别名]
# 或者: from urllib.parse import urlunparse [as 别名]
def get_x5u(self, signature):
        x5u = signature.x5u
        # Add cachebust parameter to x5u URL.
        if x5u is not None and settings.AUTOGRAPH_X5U_CACHE_BUST is not None:
            url_parts = list(urlparse.urlparse(x5u))
            query = urlparse.parse_qs(url_parts[4])
            query["cachebust"] = settings.AUTOGRAPH_X5U_CACHE_BUST
            url_parts[4] = urlencode(query)
            return urlparse.urlunparse(url_parts)
        return x5u 
开发者ID:mozilla,项目名称:normandy,代码行数:14,代码来源:serializers.py



注:本文中的urllib.parse.urlunparse方法示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。