def facebook_request(self, method, callback, **args):
self.require_setting("<STR_LIT>", "<STR_LIT>")<EOL>self.require_setting("<STR_LIT>", "<STR_LIT>")<EOL>if not method.startswith("<STR_LIT>"):<EOL><INDENT>method = "<STR_LIT>" + method<EOL><DEDENT>args["<STR_LIT>"] = self.settings["<STR_LIT>"]<EOL>args["<STR_LIT:v>"] = "<STR_LIT:1.0>"<EOL>args["<STR_LIT>"] = method<EOL>args["<STR_LIT>"] = str(long(time.time() * <NUM_LIT>))<EOL>args["<STR_LIT>"] = "<STR_LIT>"<EOL>args["<STR_LIT>"] = self._signature(args)<EOL>url = "<STR_LIT>" +urllib.urlencode(args)<EOL>http = httpclient.AsyncHTTPClient()<EOL>http.fetch(url, callback=self.async_callback(<EOL>self._parse_response, callback))<EOL>
Makes a Facebook API REST request.

        We automatically include the Facebook API key and signature, but
        it is the callers responsibility to include 'session_key' and any
        other required arguments to the method.

        The available Facebook methods are documented here:
        http://wiki.developers.facebook.com/index.php/API

        Here is an example for the stream.get() method::

            class MainHandler(tornado.web.RequestHandler,
                              tornado.auth.FacebookMixin):
                @tornado.web.authenticated
                @tornado.web.asynchronous
                def get(self):
                    self.facebook_request(
                        method="stream.get",
                        callback=self.async_callback(self._on_stream),
                        session_key=self.current_user["session_key"])

                def _on_stream(self, stream):
                    if stream is None:
                       # Not authorized to read the stream yet?
                       self.redirect(self.authorize_redirect("read_stream"))
                       return
                    self.render("stream.html", stream=stream)