首页 文章 精选 留言 我的

精选列表

搜索[接口开发],共10000篇文章
优秀的个人博客,低调大师

基于django的视频点播网站开发-step14-数据总览功能

数据总览功能,是对网站中产生的数据进行一个统计,统计出视频数、发布数、用户数、评论数,等等。让管理者对网站数据有一个清晰的认识,做到心中有数。 在本站中,笔者一共列举了下面几种数据:视频数、发布中未发布、用户数、用户新增、评论数、评论新增,等几项内容。 我们把所有的数据都封装到了一个函数里面,即 IndexView 它位于后台管理的首页。 path('', views.IndexView.as_view(), name='index'), IndexView代码如下 class IndexView(AdminUserRequiredMixin, generic.View): def get(self, request): video_count = Video.objects.get_count() video_has_published_count = Video.objects.get_published_count() video_not_published_count = Video.objects.get_not_published_count() user_count = User.objects.count() user_today_count = User.objects.exclude(date_joined__lt=datetime.date.today()).count() comment_count = Comment.objects.get_count() comment_today_count = Comment.objects.get_today_count() data = {"video_count": video_count, "video_has_published_count": video_has_published_count, "video_not_published_count": video_not_published_count, "user_count": user_count, "user_today_count": user_today_count, "comment_count": comment_count, "comment_today_count": comment_today_count} return render(self.request, 'myadmin/index.html', data) 与视频相关的统计,我们封装到了Video的models.py下面, class VideoQuerySet(models.query.QuerySet): # 视频总数 def get_count(self): return self.count() # 发布数 def get_published_count(self): return self.filter(status=0).count() # 未发布数 def get_not_published_count(self): return self.filter(status=1).count() 以上数据,大都使用了filter过滤器进行了过滤,最后通过count()函数返回给业务方。 与用户相关的统计,我们直接通过count和exclude将相关数据过滤出来。 与评论相关的统计,封装到了Comment的models.py下面, class CommentQuerySet(models.query.QuerySet): # 评论总数 def get_count(self): return self.count() # 今日新增 def get_today_count(self): return self.exclude(timestamp__lt=datetime.date.today()).count() 其中,今日新增评论,我们通过exclude来过滤时间,使用了 lt 标签来过滤。更多标签的使用方法,可参考 官方文档

优秀的个人博客,低调大师

基于django的视频点播网站开发-step15-项目部署

项目部署是一个比较大的工程,但这是笔者最喜欢的一个环节,因为在部署过程中,会遇到很多疑难问题,这些问题能促使我学到很多很多的技术。 项目部署,顾名思义,就是将自己的程序存放到远程服务器上面,让全世界的网友都能访问到。在部署之前,我们需要提前准备好一些部署的知识,包括购买服务器、安装服务器软件、服务器配置、等等。 笔者专门购买了服务器来部署我们的视频播放网站,为了避免备案,笔者购买了国外的服务器。 购买服务器 购买服务器的地方有很多,国内有阿里云、腾讯云、百度云等,国外有aws、bwh、Linode等等。如果你是学生的话,建议购买 阿里云 的服务器,因为阿里云有学生认证,打折幅度非常大。 操作系统建议选择ubuntu系统 笔者购买的是aws服务器,操作系统是Ubuntu16.04 安装软件 需要安装的软件有nginx、mysql、python、uwsgi、django,另外还有项目的依赖库。 在Ubuntu系统安装nginx非常简单,只需一行命令 sudo apt-get install nginx nginx的常用命令有 sudo service nginx start # 启动nginx sudo service nginx restart # 重启nginx sudo service nginx stop # 关闭nginx 安装mysql sudo apt-get install mysql-server 启动mysql sudo service mysql start 安装uwsgi pip3 install uwsgi 安装django pip3 install Django 拉取代码 代码仓库为https://github.com/geeeeeeeek/videoproject.git git clone https://github.com/geeeeeeeek/videoproject.git 项目里面 uwsgi.ini 为配置文件 [uwsgi] chdir = /var/www/videoproject module = videoproject.wsgi master = true processes = 2 socket = 127.0.0.1:8001 chmod-socket = 664 uid = www-data gid = www-data vacuum = true daemonize = %(chdir)/uwsgi.log nginx就是通过该配置文件和uwsgi通信的,uwsgi是以socket方式运行。 然后运行该配置 uwsgi --ini uwsgi.ini 服务器配置 需要配置nginx在/etc/nginx/sites-enabled/下新建配置文件video.conf,并写入 upstream django { server 127.0.0.1:8001; } server { listen 80; server_name yourhost.com; # 配置成你自己的域名 rewrite ^(.*) https://$host$1 permanent; } server { listen 443; server_name yourhost.com; # 配置成你自己的域名 ssl on; ssl_certificate /home/ubuntu/1_v.mypython.me_bundle.crt; # 配置成你自己的https证书 ssl_certificate_key /home/ubuntu/2_v.mypython.me.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location /static/ { alias /var/www/videoproject/static/; } location /upload/ { alias /var/www/videoproject/upload/; } location / { include uwsgi_params; uwsgi_pass django; } } nginx 与 uwsgi通信方式: server 127.0.0.1:8001 最后重启nginx即可。 访问页面

优秀的个人博客,低调大师

基于django的视频点播网站开发-step12-后台订阅功能

本讲我们会讲到一些关于发邮件的技术。我们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会通过后台给用户发送网站最新的一些动向,一般是通过邮件来发送的。当你阅读完本节内容,会对发邮件的流程有一个大概的了解。 配置相关参数 发送邮件是需要配置相关参数的,且每个邮件服务商都有自己的配置值,笔者使用的是163邮箱,在settings.py追加如下配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 邮件配置 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 465 EMAIL_HOST_USER = 'net936@163.com' EMAIL_HOST_PASSWORD = 'your pwd' 一定要记得配置 EMAIL_BACKEND ,因为django默认配置的是一种模拟发邮件的 BackEnd ,并不能使用,故要替换。 实现发邮件 我们先来写订阅推送的路由, path('subscribe/', views.SubscribeView.as_view(), name='subscribe'), 将路由设置为 SubscribeView 我们先贴出 SubscribeView 的代码 class SubscribeView(SuperUserRequiredMixin, generic.View): def get(self, request): video_list = Video.objects.get_published_list() return render(request, "myadmin/subscribe.html" ,{'video_list':video_list}) def post(self, request): video_id = request.POST['video_id'] video = Video.objects.get(id=video_id) subject = video.title context = {'video': video,'site_url':settings.SITE_URL} html_message = render_to_string('myadmin/mail_template.html', context) email_list = User.objects.filter(subscribe=True).values_list('email',flat=True) # 分组 email_list = [email_list[i:i + 2] for i in range(0, len(email_list), 2)] if email_list: for to_list in email_list: try: send_html_email(subject, html_message, to_list) except smtplib.SMTPException as e: logger.error(e) return JsonResponse({"code": 1, "msg": "发送失败"}) return JsonResponse({"code": 0, "msg": "success"}) else: return JsonResponse({"code": 1, "msg": "邮件列表为空"}) 这是一个普通的视图类,功能是由get和post共同来完成的。get中设置了要显示的模板文件myadmin/subscribe.html,它是下面的样子 当我们要给用户发送邮件的时候,需要先选择要推送的视频。然后点击通知订阅用户,即可触发ajax发送代码,ajax代码位于static/js/myadmin/send_mail.js,里面最终调用的是SubscribeView中的post方法,中post方法中,我们先通过主键获取到视频的当前实例,并且还获取到所有订阅用户的email地址放到email_list中,最后调用send_html_email将邮件发送出去,send_html_email封装在helpers.py,它的具体代码是 def send_html_email(subject, html_message, to_list): plain_message = strip_tags(html_message) from_email = settings.EMAIL_HOST_USER send_mail(subject, plain_message, from_email, to_list, html_message=html_message) def send_email(subject, content, to_list): try: message = (subject, content, settings.EMAIL_HOST_USER, to_list) send_mass_mail((message,)) except smtplib.SMTPException : print("--> send fail") return HttpResponse("fail") else: print("--> send success") return HttpResponse("success") 从代码可以看出,程序最终调用的是django自带的 send_mass_mail 函数,该函数封装了发送邮件的细节。当然还可以使用 send_mail 函数,send_mail每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail。

优秀的个人博客,低调大师

基于django的视频点播网站开发-step3-注册登录功能

用户注册登录是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果。在本讲中,我们会用到user中的用户授权方面的一些函数,还会对django中的user进行扩展,以及django中的form验证。 效果展示 注册页面 登录页面 创建users应用 django的设计哲学是,一个应用只提供一种功能,比如users应用只提供用户相关功能,comment应用只提供评论相关功能,这能提高代码的重复利用率。 在django中,只需要下面一条命令,即可建立users应用 python3 manage.py startapp users 建表 我们需要一个用户表,用来实现登录注册功能,虽然django已经自带来用户登录注册功能,也有相应的表,但是不符合中国人习惯,需要我们对user模型进行自定义。实现自定义User模型最简单的方式就是继承AbstractBaseUser,AbstractBaseUser实现了User的核心功能,我们只需加一些额外的字段进行补充即可。 User模型原有的字段有: username password last_login is_superuser first_name last_name email is_staff is_active date_joined 这些都是最基本的字段,并不能满足我们的需求。 根据网站自身业务,我们又添加了下面的字段 nickname(昵称) avatar(头像) mobile(手机号) gender(性别) subscribe(是否订阅) 我们只需在users/models.py中写入代码 from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): GENDER_CHOICES = ( ('M', '男'), ('F', '女'), ) nickname = models.CharField(blank=True, null=True, max_length=20) avatar = models.FileField(upload_to='avatar/') mobile = models.CharField(blank=True, null=True, max_length=13) gender = models.CharField(max_length=1, choices=GENDER_CHOICES,blank=True, null=True) subscribe = models.BooleanField(default=False) class Meta: db_table = "v_user" gender是性别字段,其中用到了choices=GENDER_CHOICES。这种方式常常用在下拉框或单多选框,例如 M对应男 F对应女。 url配置 在user文件夹下面,新建url.py文件,写入登录、注册和退出的url信息。app_name是命名空间,我们命名为'users'。 from django.urls import path from . import views app_name = 'users' urlpatterns = [ path('login/', views.login, name='login'), path('signup/', views.signup, name='signup'), path('logout/', views.logout, name='logout'), ] url路由配置好了,我们下面就开始写视图函数代码了 注册函数 我们先来写注册函数,写注册,当然得有注册表单了,幸运的是,在django中,可以用代码来生成表单。我们只需在users下新建forms.py文件,然后写入注册表单的代码。 class SignUpForm(UserCreationForm): username = forms.CharField(min_length=4,max_length=30, error_messages={ 'min_length': '用户名不少于4个字符', 'max_length': '用户名不能多于30个字符', 'required': '用户名不能为空', }, widget=forms.TextInput(attrs={'placeholder': '请输入用户名'})) password1 = forms.CharField(min_length=8, max_length=30, error_messages={ 'min_length': '密码不少于8个字符', 'max_length': '密码不能多于30个字符', 'required': '密码不能为空', }, widget=forms.PasswordInput(attrs={'placeholder': '请输入密码'})) password2 = forms.CharField(min_length=8,max_length=30, error_messages={ 'min_length': '密码不少于8个字符', 'max_length': '密码不能多于30个字符', 'required': '密码不能为空', }, widget=forms.PasswordInput(attrs={'placeholder': '请确认密码'})) class Meta: model = User fields = ('username', 'password1', 'password2',) error_messages = {'password_mismatch': '两次密码不一致', } 我们的表单一共有三个字段:username、password1、password2,它们都是CharField类型,widget分别是TextInput和PasswordInput。而且django是自带验证的,只需要我们配置好error_messages字典,当form验证的时候,就会显示我们自定义的错误信息。有了注册表单后,就可以在前端模板和视图函数中使用它。 下面是注册视图函数。 ... from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') raw_password1 = form.cleaned_data.get('password1') user = authenticate(username=username, password=raw_password1) auth_login(request, user) return redirect('home') else: print(form.errors) else: form = SignUpForm() return render(request, 'registration/signup.html', {'form': form}) 在signup函数中,我们通过form = SignUpForm初始化一个表单,并在render函数中传递给模板。 注册模板文件写在了templates/registration/signup.html 关键代码是 <form class="ui large form" novalidate method="post" action="{% url 'users:signup' %}" enctype="multipart/form-data" > {% csrf_token %} <div class="ui stacked segment"> <div class="field"> {{form.username}} </div> <div class="field"> {{form.password1}} </div> <div class="field"> {{form.password2}} </div> <button class="ui submit button" type="submit">注册</button> </div> {% include "base/form_errors.html" %} </form> form的action为 {% url 'users:signup' %} 即在url.py中定义的signup函数。通过post请求传递给signup,在signup中,通过如下四行代码来实现注册,并自动登录的。 username = form.cleaned_data.get('username') raw_password1 = form.cleaned_data.get('password1') user = authenticate(username=username, password=raw_password1) auth_login(request, user) 登录函数 登录函数与注册函数的模式是一样的,都是先写form,写模板,最后写视图函数。由于form和模板的代码和注册功能类似,这里就不贴了,大家可以上github查看。 重点讲一下login视图函数 def login(request): if request.method == 'POST': next = request.POST.get('next', '/') form = UserLoginForm(request=request, data=request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) if user is not None: auth_login(request, user) return redirect(next) else: print(form.errors) else: next = request.GET.get('next', '/') form = UserLoginForm() print(next) return render(request, 'registration/login.html', {'form': form, 'next':next}) 在login函数中,我们多了一个next变量,next对应的是登录后要跳转的url,其实这是一种场景,假如你在购物网站买东西,最后付款的时候,会跳转到付款页,假如你没有登录,网站会提示你登录,登录后,会再次跳转到付款页。 当然了,跳转到登录页的时候,需要你在url后追加next参数,如 aaa. com/login/?next=bbb. com 这样用户登录后就会跳到bbb. com 退出函数 from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout def logout(request): auth_logout(request) return redirect('home') 退出功能,仅需要一行代码 auth_logout(request) 就ok了。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册