implementation("androidx.compose.ui:ui:1.6.0") // Güncel sürüm 2026'da 1.7+ olabilir
implementation("androidx.compose.material3:material3:1.2.0")
implementation("androidx.compose.ui:ui-tooling-preview:1.6.0")
implementation("androidx.activity:activity-compose:1.8.0")
debugImplementation("androidx.compose.ui:ui-tooling:1.6.0")@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
MyAppTheme { // Material3 theme
Greeting("Android")
}
}import androidx.compose.material3.Text
import androidx.compose.material3.Button
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@Composable
fun Greeting(isim: String) {
Column {
Text(text = "Merhaba $isim!")
Button(onClick = { /* tıklama */ }) {
Text("Tıkla")
}
}
}class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface(modifier = Modifier.fillMaxSize()) {
Greeting("Compose Dünyası")
}
}
}
}
}import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
@Composable
fun Sayac() {
var sayac by remember { mutableStateOf(0) } // State hoisting için remember
Column {
Text("Sayaç: $sayac")
Button(onClick = { sayac++ }) {
Text("Artır")
}
}
}class SayacViewModel : ViewModel() {
private val _sayac = mutableStateOf(0)
val sayac: State<Int> = _sayac
fun artır() {
_sayac.value++
}
}
// Kullanım
val viewModel: SayacViewModel = viewModel()
Text("Sayaç: ${viewModel.sayac.value}")
Button(onClick = viewModel::artır) { ... }import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.arrangement
import androidx.compose.foundation.lazy.LazyColumn
@Composable
fun ListeOrnek() {
LazyColumn(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(100) { index ->
Text("Öğe $index", modifier = Modifier.padding(8.dp))
}
}
}implementation("androidx.navigation:navigation-compose:2.7.0")data class Todo(val id: Int, val metin: String, var tamamlandi: Boolean = false)
class TodoViewModel : ViewModel() {
private val _todos = mutableStateListOf<Todo>()
val todos: List<Todo> = _todos
fun ekle(metin: String) {
_todos.add(Todo(_todos.size, metin))
}
fun sil(todo: Todo) {
_todos.remove(todo)
}
fun toggle(todo: Todo) {
val index = _todos.indexOf(todo)
_todos[index] = todo.copy(tamamlandi = !todo.tamamlandi)
}
}@Composable
fun TodoScreen(viewModel: TodoViewModel = viewModel()) {
var yeniMetin by remember { mutableStateOf("") }
Column(modifier = Modifier.padding(16.dp)) {
Row {
TextField(value = yeniMetin, onValueChange = { yeniMetin = it })
Button(onClick = {
if (yeniMetin.isNotBlank()) {
viewModel.ekle(yeniMetin)
yeniMetin = ""
}
}) {
Text("Ekle")
}
}
LazyColumn {
items(viewModel.todos) { todo ->
Row {
Checkbox(checked = todo.tamamlandi, onCheckedChange = { viewModel.toggle(todo) })
Text(
todo.metin,
modifier = Modifier.clickable { viewModel.toggle(todo) },
textDecoration = if (todo.tamamlandi) TextDecoration.LineThrough else null
)
Spacer(Modifier.weight(1f))
Button(onClick = { viewModel.sil(todo) }) { Text("Sil") }
}
}
}
}
}setContent {
MyAppTheme {
TodoScreen()
}
}bash
mkdir fastapi-2025 && cd fastapi-2025
python -m venv venv
venv\Scripts\activate
pip install "fastapi[all]" uvicorn python-jose[cryptography] passlib[bcrypt] python-multipart psycopg2-binary sqlalchemy alembic
pip install python-dotenv
fastapi-2025/
├── app/
│ ├── main.py
│ ├── api/
│ │ └── v1/
│ │ ├── auth.py
│ │ └── users.py
│ ├── core/
│ │ ├── security.py
│ │ └── config.py
│ ├── models/
│ │ └── user.py
│ ├── schemas/
│ │ └── user.py
│ └── db/
│ └── session.py
├── alembic/
├── Dockerfile
├── requirements.txt
└── .env
python
# app/main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.v1 import auth, users
app = FastAPI(
title="FastAPI 2025 Türkiye",
description="Yüksek performanslı REST API örneği",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# CORS (gerekirse)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(auth.router, prefix="/api/v1")
app.include_router(users.router, prefix="/api/v1")
@app.get("/")
async def root():
return {"message": "FastAPI 2025 çalışıyor! /docs adresine git"}
python
# app/core/security.py
from datetime import datetime, timedelta
from jose import JWTError, jwt
from passlib.context PwdContext
SECRET_KEY = "super-secret-key-2025"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 60
pwd_context = PwdContext(schemes=["bcrypt"], deprecated="auto")
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
python
# app/api/v1/auth.py
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from app.core.security import create_access_token, verify_password
router = APIRouter()
# Basit demo kullanıcı (gerçek projede veritabanından gelecek)
FAKE_USERS_DB = {
"[email protected]": {
"username": "admin",
"hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXe.U5q7Z3qRrL7aD3shuyfgnhPFz8a8K."
# parola: "123456"
}
}
@router.post("/login")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = FAKE_USERS_DB.get(form_data.username)
if not user or not verify_password(form_data.password, user["hashed_password"]):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Kullanıcı adı veya şifre yanlış"
)
access_token = create_access_token(data={"sub": form_data.username})
return {"access_token": access_token, "token_type": "bearer"}
dockerfile
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
1. render.com → New → Web Service
2. GitHub reposunu bağla
3. Build Command: `pip install -r requirements.txt`
4. Start Command: `uvicorn app.main:app --host 0.0.0.0 --port $PORT`
5. Environment Variables → `PYTHON_VERSION=3.12`
6. Deploy → bitti! https://fastapi-2025.onrender.com/docs
json
// vercel.json
{
"version": 2,
"builds": [
{ "src": "app/main.py", "use": "@vercel/python" }
],
"routes": [
{ "src": "/(.*)", "dest": "app/main.py" }
]
}