【使用 Python 开发社交 App 详细教程】

使用 Python 开发社交 App 教程

  • 一、项目规划与设计
  • (一)需求分析
  • (二)技术选型
  • 二、后端开发
  • (一)安装和配置 Django 和 PostgreSQL
  • (二)创建 Django 项目和应用
  • (三)用户模型
  • (四)用户注册与登录
  • (五)个人资料设置与展示
  • (六)社交互动功能
  • (七)恋爱铃功能
  • (八)视频语音通话功能
  • (九)转账功能
  • 一、项目规划与设计

    (一)需求分析

    1. 社交 App
    2. 用户注册与登录。
    3. 个人资料设置与展示。
    4. 社交互动功能,如匹配、聊天、动态发布等。
    5. 兴趣标签选择,以便更好地匹配用户。
    6. 恋爱铃功能,当两个用户的兴趣标签相似度达到一定程度时触发。
    7. 视频语音通话功能。
    8. 转账功能。
    9. 管理后台
    10. 用户管理,包括查看、编辑、删除用户信息。
    11. 内容审核,对用户发布的动态进行审核。
    12. 数据统计,如用户活跃度、热门话题等。

    (二)技术选型

    1. 后端
    2. Python 的 Django 或 Flask 框架。这里我们选择 Django,因为它提供了强大的功能和丰富的插件生态系统。
    3. 数据库可以选择 MySQL、PostgreSQL 等关系型数据库,或者 MongoDB 等非关系型数据库。这里我们选择 PostgreSQL,因为它具有良好的性能和扩展性。
    4. 对于实时通信,可以使用 WebSocket 或其他实时通信技术。
    5. 前端
    6. 使用 HTML、CSS 和 JavaScript 进行开发。可以选择使用前端框架如 Vue.js 或 React.js,或者直接使用原生 JavaScript。这里我们选择 Vue.js,因为它具有高效的开发效率和良好的用户体验。
    7. 使用 UI 框架如 Element UI 或 Ant Design Vue 来提高开发效率和美观度。

    二、后端开发

    (一)安装和配置 Django 和 PostgreSQL

    1. 安装 Django:
      pip install django
      
    2. 安装 PostgreSQL 数据库,并创建一个数据库。
    3. 在 Django 项目的settings.py文件中配置数据库连接:
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.postgresql',
              'NAME': 'your_database_name',
              'USER': 'your_database_user',
              'PASSWORD': 'your_database_password',
              'HOST': 'your_database_host',
              'PORT': 'your_database_port',
          }
      }
      

    (二)创建 Django 项目和应用

    1. 创建 Django 项目:
      django-admin startproject social_app
      
    2. 创建 Django 应用:
      cd social_app
      python manage.py startapp core
      

    (三)用户模型

    1. core/models.py文件中创建用户模型:

      from django.db import models
      from django.contrib.auth.models import AbstractUser
      
      class User(AbstractUser):
          # 用户头像
          avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
          # 用户简介
          bio = models.TextField(null=True, blank=True)
          # 用户兴趣标签
          tags = models.JSONField(null=True, blank=True)
      
          def __str__(self):
              return self.username
      

      这个用户模型继承自 Django 的AbstractUser模型,添加了头像、简介和兴趣标签等字段。

    2. settings.py文件中设置自定义用户模型:

      AUTH_USER_MODEL = 'core.User'
      

    (四)用户注册与登录

    1. core/views.py文件中创建用户注册和登录视图:

      from django.contrib.auth import authenticate, login, logout
      from django.contrib.auth.forms import UserCreationForm
      from django.shortcuts import render, redirect
      
      def register(request):
          if request.method == 'POST':
              form = UserCreationForm(request.POST)
              if form.is_valid():
                  user = form.save()
                  # 注册成功后自动登录
                  login(request, user)
                  return redirect('home')
          else:
              form = UserCreationForm()
          return render(request, 'register.html', {'form': form})
      
      def login_view(request):
          if request.method == 'POST':
              username = request.POST['username']
              password = request.POST['password']
              user = authenticate(request, username=username, password=password)
              if user is not None:
                  login(request, user)
                  return redirect('home')
              else:
                  return render(request, 'login.html', {'error': 'Invalid username or password'})
          else:
              return render(request, 'login.html')
      
      def logout_view(request):
          logout(request)
          return redirect('login')
      

      这些视图函数处理用户的注册、登录和注销请求。

    2. core/urls.py文件中配置用户注册和登录的 URL:

      from django.urls import path
      from.views import register, login_view, logout_view
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
      ]
      
    3. 在项目的urls.py文件中包含core应用的 URL:

      from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('', include('core.urls')),
      ]
      

    (五)个人资料设置与展示

    1. core/views.py文件中添加个人资料视图:

      from django.shortcuts import render, redirect, get_object_or_404
      from.models import User
      
      def profile(request, username):
          user = get_object_or_404(User, username=username)
          return render(request, 'profile.html', {'user': user})
      
      def edit_profile(request):
          if request.method == 'POST':
              # 更新用户资料
              request.user.avatar = request.FILES.get('avatar')
              request.user.bio = request.POST['bio']
              request.user.tags = request.POST.getlist('tags')
              request.user.save()
              return redirect('profile', username=request.user.username)
          else:
              return render(request, 'edit_profile.html')
      

      这些视图函数用于显示用户的个人资料和编辑个人资料。

    2. core/urls.py文件中配置个人资料的 URL:

      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
      ]
      

    (六)社交互动功能

    1. 匹配功能
    2. core/views.py文件中添加匹配视图:
      from django.shortcuts import render
      from.models import User
      
      def matching(request):
          # 获取所有用户
          users = User.objects.all()
          return render(request, 'matching.html', {'users': users})
      
    3. core/urls.py文件中配置匹配的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
          path('matching/', matching, name='matching'),
      ]
      
    4. 聊天功能
    5. 安装 Django Channels 用于实现 WebSocket 通信:
      pip install channels
      
    6. settings.py文件中配置 Channels:
      ASGI_APPLICATION = 'social_app.routing.application'
      
    7. 创建routing.py文件:
      from channels.routing import ProtocolTypeRouter, URLRouter
      from django.urls import path
      from.consumers import ChatConsumer
      
      application = ProtocolTypeRouter({
          'websocket': URLRouter([
              path('ws/chat/<str:room_name>/', ChatConsumer.as_asgi()),
          ]),
      })
      
    8. 创建consumers.py文件:
      from channels.generic.websocket import AsyncWebsocketConsumer
      
      class ChatConsumer(AsyncWebsocketConsumer):
          async def connect(self):
              self.room_name = self.scope['url_route']['kwargs']['room_name']
              self.room_group_name = 'chat_%s' % self.room_name
      
              # Join room group
              await self.channel_layer.group_add(
                  self.room_group_name,
                  self.channel_name
              )
      
              await self.accept()
      
          async def disconnect(self, close_code):
              # Leave room group
              await self.channel_layer.group_discard(
                  self.room_group_name,
                  self.channel_name
              )
      
          async def receive(self, text_data):
              text_data_json = json.loads(text_data)
              message = text_data_json['message']
      
              # Send message to room group
              await self.channel_layer.group_send(
                  self.room_group_name,
                  {
                      'type': 'chat_message',
                      'message': message
                  }
              )
      
          async def chat_message(self, event):
              message = event['message']
      
              # Send message to WebSocket
              await self.send(text_data=json.dumps({
                  'message': message
              }))
      
    9. core/views.py文件中添加聊天视图:
      from django.shortcuts import render
      
      def chat(request, username):
          return render(request, 'chat.html', {'username': username})
      
    10. core/urls.py文件中配置聊天的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching, chat
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
          path('matching/', matching, name='matching'),
          path('chat/<str:username>/', chat, name='chat'),
      ]
      
    11. 动态发布
    12. core/models.py文件中添加动态模型:
      from django.db import models
      
      class Post(models.Model):
          author = models.ForeignKey('User', on_delete=models.CASCADE)
          content = models.TextField()
          created_at = models.DateTimeField(auto_now_add=True)
      
          def __str__(self):
              return self.content
      
    13. core/views.py文件中添加动态发布视图:
      from django.shortcuts import render, redirect
      from.models import Post
      from.forms import PostForm
      
      def post(request):
          if request.method == 'POST':
              form = PostForm(request.POST)
              if form.is_valid():
                  post = form.save(commit=False)
                  post.author = request.user
                  post.save()
                  return redirect('home')
          else:
              form = PostForm()
          return render(request, 'post.html', {'form': form})
      
    14. 创建core/forms.py文件:
      from django import forms
      from.models import Post
      
      class PostForm(forms.ModelForm):
          class Meta:
              model = Post
              fields = ['content']
      
    15. core/urls.py文件中配置动态发布的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching, chat, post
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
          path('matching/', matching, name='matching'),
          path('chat/<str:username>/', chat, name='chat'),
          path('post/', post, name='post'),
      ]
      

    (七)恋爱铃功能

    1. core/views.py文件中添加恋爱铃视图:
      from django.shortcuts import render
      from.models import User
      
      def love_bell(request):
          # 这里可以实现恋爱铃的逻辑
          return render(request, 'love_bell.html')
      
    2. core/urls.py文件中配置恋爱铃的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching, chat, post, love_bell
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
          path('matching/', matching, name='matching'),
          path('chat/<str:username>/', chat, name='chat'),
          path('post/', post, name='post'),
          path('love_bell/', love_bell, name='love_bell'),
      ]
      

    (八)视频语音通话功能

    1. 安装django-webrtc库:
      pip install django-webrtc
      
    2. settings.py文件中添加django-webrtcINSTALLED_APPS
      INSTALLED_APPS = [
          #...
          'django_webrtc',
      ]
      
    3. core/views.py文件中添加视频语音通话视图:
      from django.shortcuts import render
      from django_webrtc.views import webrtc_streaming
      
      def video_call(request):
          return webrtc_streaming(request)
      
    4. core/urls.py文件中配置视频语音通话的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching, chat, post, love_bell, video_call
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/<str:username>/', profile, name='profile'),
          path('edit_profile/', edit_profile, name='edit_profile'),
          path('matching/', matching, name='matching'),
          path('chat/<str:username>/', chat, name='chat'),
          path('post/', post, name='post'),
          path('love_bell/', love_bell, name='love_bell'),
          path('video_call/', video_call, name='video_call'),
      ]
      

    (九)转账功能

    1. core/models.py文件中添加转账模型:
      from django.db import models
      
      class Transaction(models.Model):
          sender = models.ForeignKey('User', on_delete=models.CASCADE, related_name='sent_transactions')
          receiver = models.ForeignKey('User', on_delete=models.CASCADE, related_name='received_transactions')
          amount = models.DecimalField(max_digits=10, decimal_places=2)
          created_at = models.DateTimeField(auto_now_add=True)
      
          def __str__(self):
              return f'{self.sender.username} to {self.receiver.username}: {self.amount}'
      
    2. core/views.py文件中添加转账视图:
      from django.shortcuts import render, redirect
      from.models import Transaction
      from.forms import TransactionForm
      
      def transfer(request):
          if request.method == 'POST':
              form = TransactionForm(request.POST)
              if form.is_valid():
                  sender = request.user
                  receiver = form.cleaned_data['receiver']
                  amount = form.cleaned_data['amount']
                  transaction = Transaction(sender=sender, receiver=receiver, amount=amount)
                  transaction.save()
                  return redirect('home')
          else:
              form = TransactionForm()
          return render(request, 'transfer.html', {'form': form})
      
    3. 创建core/forms.py文件:
      from django import forms
      from.models import Transaction
      from.models import User
      
      class TransactionForm(forms.Form):
          receiver = forms.ModelChoiceField(queryset=User.objects.all())
          amount = forms.DecimalField(max_digits=10, decimal_places=2)
      
    4. core/urls.py文件中配置转账的 URL:
      from django.urls import path
      from.views import register, login_view, logout_view, profile, edit_profile, matching, chat, post, love_bell, video_call, transfer
      
      urlpatterns = [
          path('register/', register, name='register'),
          path('login/', login_view, name='login'),
          path('logout/', logout_view, name='logout'),
          path('profile/', profile, name='profile'),
          path('edit/', edit_profile, name='edit'),
          path('chat/', chat, name='chat'),
          path('love/', love_bell, name='love'),
          path('video/', video_call, name='video'),
          path('transfer/', transfer, name='transfer'),```
      
      

    未完待续ing~

    作者:Dreams°123

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【使用 Python 开发社交 App 详细教程】

    发表回复