How can I show the vertex positions in viewport?
Well, you are passing no context
(None, None)

but then using some context in draw_callback_px
that is None
you should use POST_PIXEL because it isn't 3d
bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (bpy.context, None), 'WINDOW', 'POST_PIXEL')

you forgot to import location_3d_to_region_2d libraries
import bpy
from bpy_extras.view3d_utils import location_3d_to_region_2d

Go to Window &gt; Open System Console and you will see all the errors
so you can have something to debug what is happening there

convert coordinates from vertex to world-space
Multiply the world matrix by the object-space vector for world space coordinate:
import bpy

ob = bpy.data.objects['Cube']

v = ob.data.vertices[0].co
mat = ob.matrix_world

# Multiply matrix by vertex
loc = mat @ v


import blf
import bpy
from bpy_extras.view3d_utils import location_3d_to_region_2d


def draw_callback_px(context, dummy):
    ob = bpy.data.objects['Cube']

    v = ob.data.vertices[0].co
    mat = ob.matrix_world

    # Multiply matrix by vertex
    pos = mat @ v
    
    v3d = context.space_data
    rv3d = v3d.region_3d
    pos_text = location_3d_to_region_2d(context.region, rv3d, pos)

    blf.position(0, pos_text[0], pos_text[1], 0)
    blf.size(0, 1,1)
    blf.draw(0, str(pos))


bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (bpy.context, None), 'WINDOW', 'POST_PIXEL')

special thanks for @jfranmatheu and @batFINGER