1111import requests
1212from validator_collection import validators , checkers
1313
14+ from highcharts_core import __version__ as highcharts_version
1415from highcharts_core import errors , constants
1516from highcharts_core .decorators import class_sensitive
1617from highcharts_core .metaclasses import HighchartsMeta
@@ -57,6 +58,9 @@ def __init__(self, **kwargs):
5758 self ._files = None
5859 self ._css = None
5960 self ._js = None
61+
62+ self ._referer = None
63+ self ._user_agent = None
6064
6165 self .protocol = kwargs .get ('protocol' ,
6266 os .getenv ('HIGHCHARTS_EXPORT_SERVER_PROTOCOL' ,
@@ -87,6 +91,11 @@ def __init__(self, **kwargs):
8791 js = kwargs .get ('js' , None )
8892 resources = kwargs .get ('resources' , None )
8993
94+ self .referer = kwargs .get ('referer' ,
95+ os .getenv ('HIGHCHARTS_EXPORT_SERVER_REFERER' , 'https://www.highcharts.com' ))
96+ self .user_agent = kwargs .get ('user_agent' ,
97+ os .getenv ('HIGHCHARTS_EXPORT_SERVER_USER_AGENT' , None ))
98+
9099 if resources :
91100 self .resources = kwargs .get ('resources' , None )
92101 else :
@@ -96,6 +105,43 @@ def __init__(self, **kwargs):
96105
97106 super ().__init__ (** kwargs )
98107
108+ @property
109+ def referer (self ) -> Optional [str ]:
110+ """The referer to use when making requests to the export server. Defaults to
111+ ``'https://www.highcharts.com'``.
112+
113+ :rtype: :class:`str <python:str>` or :obj:`None <python:None>`
114+ """
115+ return self ._referer
116+
117+ @referer .setter
118+ def referer (self , value ):
119+ value = validators .url (value , allow_empty = True )
120+ if not value :
121+ value = 'https://www.highcharts.com'
122+
123+ self ._referer = value
124+
125+ @property
126+ def user_agent (self ) -> Optional [str ]:
127+ """The user agent to use when making requests to the export server. Defaults to
128+ ``Highcharts for Python / v.<VERSION NUMBER>.
129+
130+ :rtype: :class:`str <python:str>` or :obj:`None <python:None>`
131+ """
132+ if self ._user_agent :
133+ return self ._user_agent
134+
135+ return f'Highcharts for Python / v.{ highcharts_version .__version__ } '
136+
137+ @user_agent .setter
138+ def user_agent (self , value ):
139+ value = validators .string (value , allow_empty = True )
140+ if not value :
141+ value = None
142+
143+ self ._user_agent = value
144+
99145 @property
100146 def protocol (self ) -> Optional [str ]:
101147 """The protocol over which the Highcharts for Python library should communicate
@@ -926,7 +972,11 @@ def request_chart(self,
926972
927973 result = requests .post (self .url ,
928974 data = as_json .encode ('utf-8' ),
929- headers = { 'Content-Type' : 'application/json' },
975+ headers = {
976+ 'Content-Type' : 'application/json' ,
977+ 'Referer' : self .referer ,
978+ 'User-Agent' : self .user_agent ,
979+ },
930980 auth = basic_auth ,
931981 timeout = timeout )
932982
0 commit comments