Protect API docs behind authentication? · Issue #364 · fastapi/fastapi
Basic Question Does FastAPI provide a method for implementing authentication middleware or similar on the docs themselves (e.g. to protect access to /docs and /redoc)? Additional context My company...
GitHub · github.com [1]
You can protect your fastapi [2] docs behind auth so that not only can certain roles not run certain routes, but they cannot even see the docs at all. This way no one that shouldn’t be poking around can even discover routes they shouldn’t be using.
Here is the soluteion provided by @kennylajara [3]
from fastapi import FastAPI
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
from fastapi.openapi.utils import get_openapi
import secrets
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
app = FastAPI(
title="FastAPI",
version="0.1.0",
docs_url=None,
redoc_url=None,
openapi_url = None,
)
security = HTTPBasic()
def get_current_username(credentials: HTTPBasicCredentials = Depends(security)):
correct_username = secrets.compare_digest(credentials.username, "user")
correct_password = secrets...
Posts tagged: webdev
All posts with the tag "webdev"
210 posts
latest post 2026-05-01
Publishing rhythm
Cancel subscriptions
Cancel subscriptions immediately or at the end of the subscription period with proration options, invoice handling, and automatic cancellation after failed payment attempts.
stripe.com [1]
This is a handy guide to cancelling stripe subscriptions.
# Set your secret key. Remember to switch to your live secret key in production.
# See your keys here: https://dashboard.stripe.com/apikeys
import stripe
stripe.api_key = "sk_test_51ODvHtB26msLKqCAPBAo1qkBBuIfT5tQBX6YFWCLMsPixIExxITCRVa9tNCIqkdQS8olhR79NYXsFWBPKsM3LbGO00zEcNQfNI"
stripe.Subscription.modify(
"sub_49ty4767H20z6a",
cancel_at_period_end=True,
)
You can even inverse it by flipping True to False and re activate the subscription.
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://stripe.com/docs/billing/subscriptions/cancel#canceling
[2]: /thoughts/
External Link
stripe.com [1]
You can find your customers next billing date through the stripe api by using Invoice. and passing in customer, customer_details, subscription, or schedule.
import stripe
stripe.api_key = "sk_test_51ODvHtB26msLKqCAPBAo1qkBBuIfT5tQBX6YFWCLMsPixIExxITCRVa9tNCIqkdQS8olhR79NYXsFWBPKsM3LbGO00zEcNQfNI"
invoice = stripe.Invoice.upcoming(customer="cus_NeZwdNtLEOXuvB")
Within the invoice, you can find the next_payment_attempt as a epoch.
date = datetime.fromtimestamp(invoice.next_payment_attempt)
amount = invoice.amount_due
currency = invoice.currency
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://stripe.com/docs/api/invoices/upcoming
[2]: /thoughts/
Search
Use the search APIs to look up and retrieve objects in your Stripe data. Using search is a faster alternative to paginating through all resources.
stripe.com [1]
Stripe has it’s own query language for querying data. I’m just getting into using it and it seems pretty good so far. I needed to lookup the price for products. I was able to find prices for my product using the python api as shown below.
stripe.Price.search(query="active: 'true' and product: 'prod_P8SfwtxJ45cWE2'")
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://stripe.com/docs/search#search-query-language
[2]: /thoughts/
stripe-keys-and-ids.tsv [1]
tsv
Prefix Description Notes
ac_ Platform Client ID Identifier for an auth code/client id.
acct_ Account ID Identifier for an Account object.
aliacc_ Alipay Account ID Identifier for an Alipay account.
ba_ Bank Account ID Identifier for a Bank Account object.
btok_ Bank Token ID Identifier for a Bank Token object.
card_ Card ID Identifier for a Card object.
cbtxn_ Customer Balance Transaction ID Identifier for a Customer Balance Transaction object.
ch_ Charge ID Identifier for a Charge object.
cn_ Credit Note ID Identifier for a Credit Note object.
cs_live_ Live Checkout Session ID Identifier for a checkout Session object in live mode.
cs_test_ Test Checkout Session ID Identifier for a checkout Session object in test mode.
cus_ Customer ID Identifier for a Customer object.
dp_ Dispute ID Identifier for a Dispute object.
evt_ Event ID Identifier for an Event object.
fee_ Application Fee ID Identifier for an Application Fee object.
file_ File ID Identifier for a File object.
fr_ Application Fee Refund ID Identifier for an Application Fee Refund object.
iauth_ Issuing Authorization ID Identifier for an Issuing Authorization object.
ic_ Issuing Card ID ...
Looking for a Heroku replacement, What I found was shocking!
Your browser does not support the audio element.
I’ve long hosted my personal blog as a static site on waylonwalker.com. It’s
all markdown, converted to html [1], and shipped as is. It’s been great, I’ve
moved it from GitHub Pages, to Netlify, tried Vercel for a minute, and have
landed on Cloudflare Pages. Each migration has not really been that
hard, it’s just pointing ci to a different host after the site has built.
[2]
What about server side # [3]
Now the part that I have struggled with is how to cheaply host a server
rendered application that can just live on forever without me paying for it.
This is a harder problem as it costs more to keep servers spinning, memory, and
disk all ready for you to use at a moments notice.
Honestly # [4]
I never really deployed anything that useful on heroku, but it seems like the
klenex of the bunch that’s why they are in the title. I’ve moved between
digital ocean and fly.io, and have had some great experiences with both. I
just don’t want...
[1]
I’ve been using tailwind for a few months now and I can still say I’m loving
it. I’ve been using it to create some rapid prototypes that may or may not
ever become something, a document that is likely to go to print (a resume), and some quick
dashboards.
I started using Tailwind a few month back # [2]
A few months back in september of 2023 I made a case for
tailwindcss [3]. And have been
using it on quite a few projects since.
- values are well thought out
- it’s really easy to use
- classes that make sense
- tree shakable
fokais.com # [4]
I started working on fokais.com only a few weeks ago, It’s going to be a SAS to
make blogging easier. I’ve started hosting some tools for this blog that I
really like that I think I can turn into a service. It’s been fantastic to
quickly pump out new pages with tailwind.
[5]
HTMX # [7]
tailwind and htmx are a match made in heaven. They both really lean on
Location of Behavior over Separation of concerns. They do really well at
making small components that you can throw on and endpoint and stack into any
page. With tailwind I just configure it to look at all my templates, and I can
guarantee that the styles will be in app.css, ...
External Link
stackoverflow.com [1]
Get those print colors exact
body{
-webkit-print-color-adjust:exact !important;
print-color-adjust:exact !important;
}
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://stackoverflow.com/questions/3893986/css-media-print-issues-with-background-color#answer-14784655
[2]: /thoughts/
page-break-after CSS property - CSS | MDN
The page-break-after CSS property adjusts page breaks after the current element.
MDN Web Docs · developer.mozilla.org [1]
I’m working on something that might go to print, so I want the page breaks to happen somewhat in my control as the content author. As I do my writing I break my content up in to many short sections using h2, sometimes an h3. These are generally short sections that go together, should stay together, and typically are not too lengthy to cause a large white space in print.
I found a way in css to only allow page breaks to happen on h2 and h3, and it turned out perfect, suck it WSIWIG editors
* {
page-break-before: avoid;
}
h2,
h3 {
page-break-before: auto;
}
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://developer.mozilla.org/en-US/docs/Web/CSS/page-break-after
[2]: /thoughts/
How to Build a Website or App - Syntax #696
This podcast episode covers a wide range of topics related to building a website or web application from start to finish.
syntax.fm [1]
Great tips in this one. They discuss everything from front end to backend, databases and ORMS, here are a few of my favorite points.
- Use good data or good fake data
- make it have some variation like long and short text
- Don’t use a database if you need one, static content is eaiser to manage
- end to end test, (does the site load page x)
- You DONT NEED all this complexity, you can deploy a site with HTML [2] and CSS.
Note
This post is a thought [3]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://syntax.fm/show/696/how-to-build-a-website-or-app
[2]: /html/
[3]: /thoughts/
External Link
X (formerly Twitter) · twitter.com [1]
Fastapi [2] passes flask in GitHub stars!
[1]
Note
This post is a thought [3]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://twitter.com/tiangolo/status/1729153717956715007
[2]: /fastapi/
[3]: /thoughts/
-
Nice take by @t3dotgg [1]. Some of the old patterns that go deep into webdev, MVC, separation of concerns, REST, are things we are told to believe on day one, thrown so many things, no mental bandwidth, or experience to form our own opinions we must take them as fact. Rarely do we take these facts and revisit them with our new understandings years later.
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://twitter.com/t3dotgg
[2]: /thoughts/
Heroicons
Beautiful hand-crafted SVG icons, by the makers of Tailwind CSS.
Heroicons · heroicons.com [1]
heroicons is a really nice set of many of the basic icons that you will need for building nice ui’s. They have a really nice copy as svg or jsx button, so that you can just yank it and paste it on your page without any extra packages or installation.
Note
This post is a thought [2]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://heroicons.com/
[2]: /thoughts/
External Link
X (formerly Twitter) · twitter.com [1]
Wes has some of the coolest OG [2] images i’ve ever seen. Here he talks about how to enable cache configuration so that its constantly updating the cache without the user waiting for the image to be created.
Note
This post is a thought [3]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://twitter.com/wesbos/status/1717923624559005977
[2]: /og/
[3]: /thoughts/
htmx ~ Locality of Behaviour (LoB)
Carson Gross explores the Locality of Behaviour (LoB) principle, which emphasizes making the behavior of code units obvious on inspection to enhance maintainability. He discusses the tradeoffs betw...
htmx.org [1]
Interesting principle here. What a great example, If I’m looking at the second jQuery example, I have to dig into dev tools or make some assumtions that this team uses jQuery, and selects by id, therefore I can grep for $("#d1").
Consider two different implementations of an AJAX request in HTML [2], the first in htmx [3]:
<button hx-get="/clicked">Click Me</button>
> and the second in jQuery:
``` js
$("#d1").on("click", function(){
$.ajax({
/* AJAX options... */
});
});
<button id="d1">Click Me</button>
Note
This post is a thought [4]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://htmx.org/essays/locality-of-behaviour/
[2]: /html/
[3]: /htmx/
[4]: /thoughts/
-
Tailwind comes with space that I have never heard of that is made to give margin and padding together in one class. Adam dropped it here in the Tailwind Connect conference.
Note
This post is a thought [1]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: /thoughts/
Litestar: Effortlessly Build Performant APIs
We all know about Flask and Django. And of course FastAPI made a huge splash when it came on the scene a few years ago. But new web frameworks are being created all the time. And they have these ea...
talkpython.fm [1]
Litestar is an interesting api framework similar to fastpi, that I am interested to check out to see if it fits into some project scope. It sounds like it comes with a lot more batteries included for things like auth, but does not have hard opinions like django. At this point I’m not jumping off of fastapi [2], but its something I want to try.
Note
This post is a thought [3]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://talkpython.fm/episodes/show/433/litestar-effortlessly-build-performant-apis
[2]: /fastapi/
[3]: /thoughts/
![[None]]
Yet again twitter cards were causing me pain. This time it was me not realizing that they require full urls, and not relative or abolute urls.
This was not working
<meta name="twitter:image" content="/shot/?path={{ request.url|quote_plus }}" content-type='image/png'/>
This does work with a full url
<meta name="twitter:image" content="https://thoughts.waylonwalker.com/shot/?path={{ request.url|quote_plus }}" content-type='image/png'/>
Note
This post is a thought [1]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: /thoughts/
-
Boot.dev is crushing it with these interviews. This one has Wes Bos, includes teaching, webdev, where is webdev headed.
Note
This post is a thought [1]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: /thoughts/
GitHub - sysid/sse-starlette
Contribute to sysid/sse-starlette development by creating an account on GitHub.
GitHub · github.com [1]
sse-FastAPI [2].">starlette provides server sent events for startlette and FastApi. I’m evaluating for use with htmx [3].
Installation: # [4]
pip install sse-starlette
Usage: # [5]
import asyncio
import uvicorn
from starlette.applications import Starlette
from starlette.routing import Route
from sse_starlette.sse import EventSourceResponse
async def numbers(minimum, maximum):
for i in range(minimum, maximum + 1):
await asyncio.sleep(0.9)
yield dict(data=i)
async def sse(request):
generator = numbers(1, 5)
return EventSourceResponse(generator)
routes = [
Route("/", endpoint=sse)
]
app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000, log_level='info')
Note
This post is a thought [6]. It’s a short note that I make
about someone else’s content online #thoughts
References:
[1]: https://github.com/sysid/sse-starlette
[2]: /fastapi/
[3]: /htmx/
[4]: #installation
[5]: #usage
[6]: /thoughts/