Django 产品从1.X升级到2.X的移植

简介: Django 产品从1.X升级到2.X的移植

关于Django可以参阅我在清华大学出版社出版的书《基于Django的电子商务网站技术》一书。在书中我采用的版本是1.11.4,后来Django升级到了1.11.10,产品仍旧可以正常执行,但是当我把Django升级到2.X版本后,程序就不能运行了,参考了一下网上的资料,发现主要2.0的在路由方面做了改动。在1.X版本中,我们在url.py文章中使用的是fromdjango.conf.urlsurl方法。在书中我采用如下代码:


from django.conf.urls import url
from django.contrib import admin
from goods import views       
from django.views import static
import os
BASE_DIR =  os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
urlpatterns = [
        url(r'^$',  views.index),
        url(r'^index/$',  views.index),
        url(r'^admin/',  admin.site.urls),
        url(r'^logout/$',  views.logout),
        url(r'^register/$',  views.register),
        url(r'^user_info/$',  views.user_info),
        url(r'^login_action/$',  views.login_action),
        url(r'^search_name/$',  views.search_name),
     url(r'^change_password/$', views.change_password),
        url(r'^goods_view/$',  views.goods_view),
        url(r'^view_goods/(?P<good_id>[0-9]+)/$',  views.view_goods),
        url(r'^view_chart/$',  views.view_chart),
        url(r'^remove_chart_all/$',  views.remove_chart_all),
        url(r'^remove_chart/(?P<good_id>[0-9]+)/$',  views.remove_chart),
        url(r'^add_chart/(?P<good_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.add_chart),
        url(r'^update_chart/(?P<good_id>[0-9]+)/$',  views.update_chart),
        url(r'^view_address/$',  views.view_address),
        url(r'^add_address/(?P<sign>[0-9]+)/$',  views.add_address),
        url(r'^delete_address/(?P<address_id>[0-9]+)/(?P<sign>[0-9]+)/$',views.delete_address),
        url(r'^update_address/(?P<address_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.update_address),
        url(r'^delete_orders/(?P<orders_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.delete_orders),
        url(r'^create_order/$',  views.create_order),
        url(r'^view_order/(?P<orders_id>[0-9]+)/$',  views.view_order),
        url(r'^view_all_order/$',  views.view_all_order),
        url(r'^upload/(?P<path>.*)',static.serve,{'document_root':os.path.join(BASE_DIR,'upload')}),
        url(r'^static/(?P<path>.*)',static.serve,{'document_root':os.path.join(BASE_DIR,'static')}),
]


而在2.X中被from django.urls 中的 pathre_path类取代,关于re_path方法基本上与url方法保持一致,但是不支持static.serve了,而对于path方法不支持正则表达式,主要介绍如下。


应用方法:

from django.urls import path,re_path


使用:

path('view_goods/<int: good_id >/', views.view_goods),


对应于

url(r'^view_goods/(?P<good_id>[0-9]+)/$', views.view_goods),


我们可以看出,这里的:

  • view_goods:为路径名;
  • <int: good_id >int表示数字,参数名为good_id
  • views.view_goods仍旧表示为view.py中的view_goods方法中定义的逻辑。

关于int共有以下五类(这五类Django称作转换器):

  1. str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  2. int,匹配正整数,包含0
  3. slug,匹配字母、数字以及横杠、下划线组成的字符串。
  4. uuid,匹配格式化的uuid,如075194d3-6885-417e-a8a8-6c931e272f00
  5. path,匹配任何非空字符串,包含了路径分隔符(/)(不能用问号,因为问号在url地址有特殊含义。)

这样我的代码就变成了如下形式。

from django.conf.urls import url
from django.urls import re_path
from django.contrib import admin
from goods import views       
from django.views import static
import os
from django.conf.urls.static import  static
from . import settings
urlpatterns = [
        re_path(r'^$',  views.index),
        re_path(r'^index/$',  views.index),
        re_path(r'^admin/',  admin.site.urls),
        re_path(r'^logout/$',  views.logout),
        re_path(r'^register/$',  views.register),
        re_path(r'^user_info/$',  views.user_info),
        re_path(r'^login_action/$',  views.login_action),
        re_path(r'^search_name/$',  views.search_name),
     re_path(r'^change_password/$', views.change_password),
        re_path(r'^goods_view/$',  views.goods_view),
        re_path(r'^view_goods/(?P<good_id>[0-9]+)/$',  views.view_goods),
        re_path(r'^view_chart/$',  views.view_chart),
        re_path(r'^remove_chart_all/$',  views.remove_chart_all),
        re_path(r'^remove_chart/(?P<good_id>[0-9]+)/$',  views.remove_chart),
        re_path(r'^add_chart/(?P<good_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.add_chart),
        re_path(r'^update_chart/(?P<good_id>[0-9]+)/$',  views.update_chart),
        re_path(r'^view_address/$',  views.view_address),
        re_path(r'^add_address/(?P<sign>[0-9]+)/$',  views.add_address),
        re_path(r'^delete_address/(?P<address_id>[0-9]+)/(?P<sign>[0-9]+)/$',views.delete_address),
        re_path(r'^update_address/(?P<address_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.update_address),
        re_path(r'^delete_orders/(?P<orders_id>[0-9]+)/(?P<sign>[0-9]+)/$',  views.delete_orders),
        re_path(r'^create_order/$',  views.create_order),
        re_path(r'^view_order/(?P<orders_id>[0-9]+)/$',  views.view_order),
        re_path(r'^view_all_order/$', views.view_all_order),
]


细心的读者可能会发现,我这里没有定义静态变量,即以前代码中的。


url(r'^upload/(?P<path>.*)',static.serve,{'document_root':os.path.join(BASE_DIR,'upload')}),
url(r'^static/(?P<path>.*)',static.serve,{'document_root':os.path.join(BASE_DIR,'static')}),


Django 2.0中我们可以这样解决。

首先我们打开settings.py文件,找到

# Static files (CSS, JavaScript, Images)

# https://docs.djangoproject.com/en/1.11/howto/static-files/


位置,加入如下代码。

STATIC_URL = '/static/'
STATIC_URL = '/upload/'
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,"static"),
     os.path.join(BASE_DIR,"upload"),
)


然后重新打开url.py,在最后下面加上如下代码。

re_path(r'^view_all_order/$',  views.view_all_order),
]+ static(settings.STATIC_URL,  document_root = settings.STATICFILES_DIRS)+static(settings.STATIC_URL,  document_root = settings.STATICFILES_DIRS)


最后一点很重要,我们在启动的时候一定要加上--insecure参数,即


python  manage.py runserver 0.0.0.0:8000 --insecure


经过这番改造,在运行我的接口测试代码,全部通过。

目录
相关文章
|
6月前
|
运维 Serverless 测试技术
函数计算产品使用问题之如何部署Django服务
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用合集之基于django应用模板创建的FC,如何配置数据库
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
7月前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
前端开发 Python
【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)
【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)
【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)
|
中间件 Python 持续交付
Django从1.8升级到2.0注意事项
由于Django的产品周期问题,我们决定将Django从当前开发的1.8版本升级到2.0版本,此新最版本已不再支持python2,所以开发语言也需要相应升级到3.6版本。
3329 0
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
186 45
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
67 2
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
149 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
44 1