Windows+Apache+Python+Django 踩坑记录

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Windows+Apache+Python+Django 踩坑记录摘要  使用Python进行Web项目开发;相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具有一定的优势,相对 Java/.NET 有更轻量级的部署方案,相对PHP有更安全开放的环境支持,这些不同点几乎完全取决于Python语言本身的特性。

Windows+Apache+Python+Django 踩坑记录
摘要
  使用Python进行Web项目开发;相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具有一定的优势,相对 Java/.NET 有更轻量级的部署方案,相对PHP有更安全开放的环境支持,这些不同点几乎完全取决于Python语言本身的特性。

0x01: 环境部署
  注:开发环境与运行环境的部署需要的基本技能 —— 理论基础知识扎实,了解相关基本原理,了解具体开发体系;如果不具备这些能力那么遇到问题就会很懵

  0x11: Windows+Apache 部署
  1. Apache压缩包直接百度 "Apache" 就能找到官网下载了,飞机票>> Apache24 ;压缩包解压至安装目录,路径最好不要含有中文和空格(江湖规矩)

  2. httpd.conf 配置文件(apachePath/conf/httpd.conf),Apache部署中最重要的部分,一般只用修改第一条 ServerRoot 就可以了,文档中 "#" 为行注释

    ServerRoot 改为你的真实路径(一般在37行上下),Ex: ServerRoot "D:/Program/Apache/Apache24",新版本Apache中采用 "SRVROOT" 宏替换后面所有会用到路径的地方,新版本修改 Define SRVROOT "c:/Apache24" 为真实路径可全局替换,较老版本要手动修改以下两个地方:标识静态文件路径(大概在251行上下)以及文件访问权限,CGI 脚本路径及访问权限(大概在368/380行上下);注意:路径分隔为 "/" 而不是 ""

    Listen 为监听端口,默认80(通常在60行上下)一般不用修改

    LoadModule 为随Apache启动加载的模块(71-185左右),一般不用管

    ServerName 取消注释(225上下),好像是 IANA DNS导航什么的

    DocumentRoot 表示静态文件路径,见第一条 ServerRoot

    ErrorLog 表示记录文件输出路径(300行上下),debug的时候会经常用到这个文件,不更改记录级别的话提示警告什么的也在里面,我也不知道咋回事儿

    LogLevel 表示记录输出级别(310行上下),取值文档中有注释麻烦自己看

    Include 表示要引入的其它配置文件(原文档中490-530行大量出现),要使用了再详细了解吧

     表示文件访问权限,按类型限制

     标签表示如果加载了 xxx_module 模块就将其内容作为该模块的配置

     标签表示文件夹权限,见第一条 ServerRoot

  3. 安装/卸载系统服务,不安装没法用

    安装:管理员权限打开控制台,cd 到 Apache24/bin/ 目录下,执行 "httpd -k install" 将Apache服务注入系统,可使用 -n 参数指定服务名(一般不要这么干),Ex: "httpd -k install -n "Apache2439" ",如此步安装过程报错考虑可能是VC库版本问题,一般Apache压缩包中会有一个空文件,文件名表示该版本所依赖的VC库,若无请自行下载

    安装完成后可到系统服务将该服务 "自动启动" 改为手动启动,否则该服务将随系统开启而启动;如果部署到服务器则不用修改

    卸载:管理员权限打开控制台,cd 到 Apache24/bin/ 目录下,执行 "httpd -k uninstall" 卸载服务,若注入服务时使用 -n 参数指定服务名则此处也要用 -n 参数指定

  4. 启动/停止/重启服务

    启动:管理员权限打开控制台,cd 到 Apache24/bin/ 目录下,执行 "httpd -k start" 开始运行服务器,若注入服务时使用 -n 参数指定服务名则此处也要用 -n 参数指定

    重启:"httpd -k restart"

    停止:"httpd -k stop"

    其它:"httpd -h" 可查看httpd支持的所有命令,当然,是英文版的

  n. 若上述步骤都没有什么问题,则访问 127.0.0.1 就能看到 "It works!" 了(服务器需允许httpd.exe通过防火墙)

  0x21: Apache+Django部署
  注:Python安装都不会的就不用继续看了

  1. 运行模式解释,Apache服务器脚本运行模式有一大堆,具体是咋回事儿我也不是很懂,以下是我对其中一部分的个人理解,若有偏差欢迎指正

    CGI: 服务器收到请求后由配置信息找到CGI程序(脚本)路径,随后由该程序指定的运行方式运行(直接运行或解析器),然后将执行结果返回给服务器调用处

    FCGI: GCI的升级版,改进CGI每次服务器的请求都会调用一次CGI程序体浪费空间和性能的缺点;FCGI创建一个程序执行的管理程序,服务器只与管理程序通信(通信机制一般使用socket)。每次请求会被FGCI管理程序分配给工作进程或线程,由于管理进程事先会启动多个工作进程/线程,所以省去了事务生成/销毁的系统开销

    WSGI: FCGI的改进版,管理程序实现方式改为服务器插件而不是使用socket通信,官方文档中一般使用 Middleware(中间件) 这个概念,可避免端口占用,主要性能提升在于降低通信开销(内存共享快于socket通信)

  2. 中间件 mod_wsgi 是Django在Apache上的一种方案,采用上述WSGI的实现方式

  3. Django安装,建议直接 "pip install django" 安装,安装完成后会有 "Success" 之类的提示,可执行 "pip list" 可查看安装包列表内是否有 "Django x.x.x" 以确认安装

    3.1 pip安装缓慢原因:下载源在国外,解决:修改下载源,方法:"C:/Users/用户名" 目录下创建 "pip" 文件夹,文件夹内创建 "pip.ini" 配置文件,内容为:

      [global]

      index-url = https://pypi.douban.com/simple/

    3.5. Django中一些基础概念的介绍

      项目:一个Web项目的容器,其中包括该Web项目要用到的所有文件,例如静态文件、Python脚本、数据库等

      应用:Web项目中的一个功能的所有实现,代码以及数据

      项目和应用是多对多的关系,一个项目可由多个应用构成,一个应用可供多个项目使用

  4. mod_wsgi 安装,去Python库里下载mod_wsgi,模块版本一定要对应Apache和Python的版本,因为这是一个中间件,就是用来适配两端模块的,再送一张飞机票>> mod_wsgi ,下载到的是 whl 文件,使用 "pip install mod_wsgi-xxx.whl" 进行安装

  5. 创建Django项目/应用

    控制台执行 "django-admin startproject projName" ,生成一个Django项目,同上 django-admin 也在Python 中 Scripts 目录下,该命令会在指定目录生成一个Django项目文件结构,不指定目录则生成在当前目录,使用 "django-admin startapp appName" 生成一个应用,贴出自用的一个生成项目和应用的 .bat 脚本

newDjango.bat
  

  6. Apache 适配 mod_wsgi 中间件,修改配置文件 httpd.conf

    注:网上一堆找 xxx.so 模块文件再改上述 httpd.conf 中 LoadModule 是不可行的,因为Python3之后的版本使用的模块为 pyd 格式

    控制台执行 "mod_wsgi-express module-config" ,该命令中的 mod_wsgi-express 在 Python 目录中 Scripts 文件夹下,如果环境变量 Path 中没有该 Scripts 的路径就 cd 过去再用,将得到的3行结果复制下来,粘贴到 Apache 中的 httpd.conf 配置文件末尾,一般是 LoadFile+LoadModule+WSGIPythonHome,分别表示Python解析器路径/中间件路径/Python容器路径,(也可执行 "mod_wsgi-express module-config >> ApachePath/conf/httpd.conf",ApachePath代表Apache安装根目录,如果你熟悉命令行应该知道这是个啥)

    添加行 " WSGIScriptAlias / "djangoPath/djangoName/wsgi.py" ",该行为Apache找到Django项目提供依据,路径为Django项目下的 wsgi.py 文件

    添加行 " WSGIPythonPath "djangoPath" ",该行为Django项目的容器路径

    配置 wsgi.py 的访问权限:

      

       
        Require all granted
       
      

    配置静态文件路径及访问权限:

      Alias /static "djangoPath/static"

      
       AllowOverride None
       Options None
       Require all granted
      

    配置多媒体文件路径及访问权限:(可选)

      Alias /media "djangoPath/media"

      
       AllowOverride None
       Options None
       Require all granted
      

    我的配置代码

httpd.conf
  n. 配置完成以上内容重启Apache,使用浏览器访问 127.0.0.1 就能看到Django的欢迎界面了(服务器需要在Django项目中setting.py中设置 "ALLOWED_HOSTS=['*']",详见Django配置文件解析)

0x02: 使用Django进行开发(Python3.7+Django2.2.2)
  0x12: Django框架简介
  1. MVT,应该属于设计模式什么的吧,其实思想和MVC差不多

    M(Model): 数据持久层,操作数据库的

    V(View): 视图层,其实是控制逻辑的

    T(Template): 模板层,返回给用户看的内容

  2. 最小文件结构,执行 "django-admin startproject projName" 生成

  projName

   |-- projName

   |--  |--  __pycahce__

#首次运行后自动生成的Python二进制文件

   |--   |--  ....pyc

   |--  |--  __init__.py #空文件,Python模块标识

   |--  |--  setting.py #该项目的配置信息

   |--  |--  urls.py #该项目的所有URL路由

   |--  |--  wsgi.py #WSGI的接口??

   |-- db.selite3 #项目首次运行后自动生成的数据库文件(若未修改Django默认使用的数据库SQLite3)

   |-- manage.py #管理该项目的文件

  3. 扩展文件结构,自行创建(可选)的文件结构

    projName/templates

: 放置html文件的路径,Django中成为模板文件

    projName/static

: 放置静态文件,包括css/js/image

    projName/media

: 放置多媒体文件,大概除了上面两个其它的文件都可以放这儿吧,也不是很懂这是干嘛的

    projName/projName/views.py: 视图文件,其实名字随便取,但最好这样(江湖规矩)

    projName/projName/models.py: 模型文件,用来编写模型的,只能是这个名字好像

  0x22: 项目配置,setting.py
    BASE_DIR: 项目所在路径,不常改

    SECRET_KEY: 啥密钥来着??不常改

    DEBUG: 调试模式默认为True,用于输出调试信息,项目上线后应改为False

    ALLOWED_HOSTS: 允许通过的地址,上线后一般设置为['*']

    INSTALLED_APPS: 安装的应用,创建应用后需要在此添加

    MIDDLEWARE: Django提供的工具集,如CSRF

    ROOT_URLCONF: url配置文件,指向项目下的urls.py路由文件,一般不改

    TEMPLATES: 模板配置文件

    WSGI_APPLICATION: CGI应用实例,一般不改

    DATABASES: 数据库配置

    AUTH_PASSWORD_VALIDATORS: 密码认证配置,一般不改

    # 以下为国际化配置

    LANGUAGE_CODE: 语言('zh-hans'),设置为中文后Django主页显示为中文

    TIME_ZONE: 时区('Asia/Shanghai')

    USE_I18N: 国际化

    USE_I10N: 国际化

    USE_TZ: 时间存储带时区(False)

    STATIC_URL: 静态文件(CSS/JS/Image/Fonts)位置('/static/')

    # 以下为非默认配置

    APPEND_SLASH: 自动在url后加 '/', 默认为True

    STATICFILES_DIRS: 静态文件路径,设置为 (os.path.join(BASE_DIR, 'static'),) ,否则使用Django自带服务器启动时不能访问静态文件

  0x32: 其它常用操作
  1. 数据迁移,数据库生成与更改后都应执行数据迁移指令,控制台执行以下命令

    python manage.py makemigrations #创建数据库文件夹migrations(存在则跳过)

    python manage.py migrate #生成数据表及填充权限

    创建管理员用户,用于登录Django的控制台 127.0.0.1/admin

      python manage.py createsuperuser #创建管理员,然后输入一堆信息就成了

  2. 新应用目录结构,略

  3. 启动Django自带的Web调试服务器,只能用作调试,并发性为0

    控制台cd到Django项目根目录下,执行 "python manage.py runserver",Django会在127.0.0.1:8000开启服务器,runserver 可选参数为[ip:port]

  4. 新增应用后,应在 setting.py 文件中的 INSTALLED_APPS 中添加该应用的名称

  5. 使用MySQL数据库,大概记录一下(我使用的默认的sqlite,没有用MySQL)

    MySQL数据库安装,请自行百度

    Python MySQL连接驱动安装,老规矩 "pip install pymysql"

    项目中使用MySQL数据库需要在 __init__.py 中初始化数据库,代码为:

      import pymysql

      pymysql.install_as_MySQLdb()

    修改项目 setting.py 文件数据库部分:

DATABASES
  6. setting.py 模板路径设置,TEMPLATES 中 'DIRS':[BASE_DIR+'/templates',]

  7. Django后台管理工具,以下只做简要介绍,其它请自行查找

    访问 127.0.0.1/admin进入管理页面(未登录显示登录)

    服务器部署 页面没有css样式原因:未作 admin 静态文件迁移(Apache配置文件中将权限交给Django后没有决定路径解析的权限),解决:将 "PythonPath/Lib/site-packages/django/contrib/admin/static" 目录下的 "admin" 目录拷至 "ApachePath/htdocs/djangoName/static" 文件夹下

  8. Ajax禁止问题,报错为 "CSRF token missing or incorrect.",原因:CSRF阻止,解决:注释掉配置文件 setting.py 中 "MIDDLEWARE" 中的 csrf 插件

  0x42: 开发部分
  1. 核心部分概述

    urls.py: Django中的路由系统,说明网址与视图层(函数调用)的映射关系

    views.py: Django中的视图层,其中放置的函数供路由系统调用

    models.py: Django中的模型层,供视图层调用,用于处理数据持久化,屏蔽相对底层的操作(直接操作SQL语句),当然Django也提供直接执行SQL语句的接口,但不建议你这么干

  2. urls.py, views.py, models.py

View Code
    编写完成后重启服务器,访问 127.0.0.1:8000/sayHello 就能看到结果了

  3. 一个使用模板+静态资源的示例,setting.py 中需配置 STATICFILES_DIRS 的值

    文件结构

   projName

    |--  projName

     |--  __init__.py

     |--  settings.py

     |--  urls.py

     |--  views.py

     |--  wsgi.py

    |--  static

     |--  templateTest.css

     |--  templateTest.jpg

     |--  templateTest.js

    |--  templates

     |--  templateTest

    |--  manage.py

View Code
0x03: 后记
  写得有点久了,95%是在做东西的时候写的,到发布的时候已经快一个月时间了,其中有些东西现在也记不大清了;当时没有发布我觉得可能有些重要的地方没写完,发布之前我又重新把上面的东西都跑了一次,发现果然是有些东西没写到 0.0

  这篇文章可能不是描述的最详细的,但应该是这一套技术比较全面的了,如果有什么问题或建议请回复评论(虽然最后确实头都写晕了 555~)

  原创文章,转发请注明
原文地址https://www.cnblogs.com/sxdc/p/11145478.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
10
分享
相关文章
基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。
36 5
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
412 45
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
196 2
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
100 1
将 Python UDF 部署到 Apache IoTDB 的详细步骤与注意事项
【10月更文挑战第21天】将 Python UDF 部署到 Apache IoTDB 中需要一系列的步骤和注意事项。通过仔细的准备、正确的部署和测试,你可以成功地将自定义的 Python UDF 应用到 Apache IoTDB 中,为数据处理和分析提供更灵活和强大的支持。在实际操作过程中,要根据具体情况进行调整和优化,以确保实现最佳的效果。还可以结合具体的代码示例和实际部署经验,进一步深入了解和掌握这一过程。
71 2
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
101 4
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第10天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django以功能全面、文档完善著称,适合快速开发;Flask轻量灵活,易于上手;Pyramid介于两者之间,兼顾灵活性和安全性。选择框架时需考虑项目需求和个人偏好。
108 1
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
161 4
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
82 1
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
514 33
The Past, Present and Future of Apache Flink
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等