使用Python进行Web项目开发;相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具备必定的优点,相对 Java/.NET 有更轻量级的部署方案,相对PHP有更安全开放的环境支持,这些不一样点几乎彻底取决于Python语言自己的特性。javascript
注:开发环境与运行环境的部署须要的基本技能 —— 理论基础知识扎实,了解相关基本原理,了解具体开发体系;若是不具有这些能力那么遇到问题就会很懵css
1. Apache压缩包直接百度 "Apache" 就能找到官网下载了,飞机票>> Apache24 ;压缩包解压至安装目录,路径最好不要含有中文和空格(江湖规矩)html
2. httpd.conf 配置文件(apachePath/conf/httpd.conf),Apache部署中最重要的部分,通常只用修改第一条 ServerRoot 就能够了,文档中 "#" 为行注释java
ServerRoot 改成你的真实路径(通常在37行上下),Ex: ServerRoot "D:/Program/Apache/Apache24",新版本Apache中采用 "SRVROOT" 宏替换后面全部会用到路径的地方,新版本修改 Define SRVROOT "c:/Apache24" 为真实路径可全局替换,较老版本要手动修改如下两个地方:标识静态文件路径(大概在251行上下)以及文件访问权限,CGI 脚本路径及访问权限(大概在368/380行上下);注意:路径分隔为 "/" 而不是 "\"python
Listen 为监听端口,默认80(一般在60行上下)通常不用修改mysql
LoadModule 为随Apache启动加载的模块(71-185左右),通常不用管sql
ServerName 取消注释(225上下),好像是 IANA DNS导航什么的数据库
DocumentRoot 表示静态文件路径,见第一条 ServerRootexpress
ErrorLog 表示记录文件输出路径(300行上下),debug的时候会常常用到这个文件,不更改记录级别的话提示警告什么的也在里面,我也不知道咋回事儿apache
LogLevel 表示记录输出级别(310行上下),取值文档中有注释麻烦本身看
Include 表示要引入的其它配置文件(原文档中490-530行大量出现),要使用了再详细了解吧
<Files xx.xx*> 表示文件访问权限,按类型限制
<IfModule xxx_module> 标签表示若是加载了 xxx_module 模块就将其内容做为该模块的配置
<Directory xxxx> 标签表示文件夹权限,见第一条 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经过防火墙)
注: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 脚本
@echo off echo. ** Django ** echo.新建 Django 项目输入 1 echo.新建 Django 应用输入 2 set /p cho=输入后回车: goto tag%cho% :tag1 set /p projName=输入项目名: django-admin startproject %projName% goto end :tag2 set /p appName=输入应用名: django-admin startapp %appName% :end echo.请自查当前目录是否生成文件 pause
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 的访问权限:
<Directory "djangoPath/djangoName">
<Files "wsgi.py">
Require all granted
</Files>
</Directory>
配置静态文件路径及访问权限:
Alias /static "djangoPath/static"
<Directory "djangoPath/static">
AllowOverride None
Options None
Require all granted
</Directory>
配置多媒体文件路径及访问权限:(可选)
Alias /media "djangoPath/media"
<Directory "djangoPath/media">
AllowOverride None
Options None
Require all granted
</Directory>
个人配置代码
#配置wsgi.py访问权限 WSGIScriptAlias / "D:/Program/Apache/Apache24/htdocs/dj/dj/wsgi.py" WSGIPythonPath "D:/Program/Apache/Apache24/htdocs/dj" <Directory "D:/Program/Apache/Apache24/htdocs/dj/dj"> <Files "wsgi.py"> Require all granted </Files> </Directory> #此项为静态文件路径 Alias /static "D:/Program/Apache/Apache24/htdocs/dj/static" #静态路径权限配置 <Directory "D:/Program/Apache/Apache24/htdocs/dj/static"> AllowOverride None Options None Require all granted </Directory> #此项为多媒体文件路径 Alias /media "D:/Program/Apache/Apache24/htdocs/dj/media" #多媒体权限配置 <Directory "D:/Program/Apache/Apache24/htdocs/dj/media"> AllowOverride None Options None Require all granted </Directory>
n. 配置完成以上内容重启Apache,使用浏览器访问 127.0.0.1 就能看到Django的欢迎界面了(服务器须要在Django项目中setting.py中设置 "ALLOWED_HOSTS=['*']",详见Django配置文件解析)
1. MVT,应该属于设计模式什么的吧,其实思想和MVC差很少
M(Model): 数据持久层,操做数据库的
V(View): 视图层,实际上是控制逻辑的
T(Template): 模板层,返回给用户看的内容
2. 最小文件结构,执行 "django-admin startproject projName" 生成
projName
|-- projName<DIR>
|-- |-- __pycahce__<DIR> #首次运行后自动生成的Python二进制文件
|-- |-- ....pyc
|-- |-- __init__.py #空文件,Python模块标识
|-- |-- setting.py #该项目的配置信息
|-- |-- urls.py #该项目的全部URL路由
|-- |-- wsgi.py #WSGI的接口??
|-- db.selite3 #项目首次运行后自动生成的数据库文件(若未修改Django默认使用的数据库SQLite3)
|-- manage.py #管理该项目的文件
3. 扩展文件结构,自行建立(可选)的文件结构
projName/templates<DIR>: 放置html文件的路径,Django中成为模板文件
projName/static<DIR>: 放置静态文件,包括css/js/image
projName/media<DIR>: 放置多媒体文件,大概除了上面两个其它的文件均可以放这儿吧,也不是很懂这是干吗的
projName/projName/views.py: 视图文件,其实名字随便取,但最好这样(江湖规矩)
projName/projName/models.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自带服务器启动时不能访问静态文件
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 = { 'default': { 'ENGINE': 'django.db.backends.mysql', #Django中Model的实现 'NAME': 'dbName', #数据库名称 'USER': 'loginUserName', #登陆用户 'PASSWORD': 'loginPwd', #登陆密码 'HOST': '127.0.0.1', #数据库位置 'PORT': '3306', #数据库监听端口 } }
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 插件
1. 核心部分概述
urls.py: Django中的路由系统,说明网址与视图层(函数调用)的映射关系
views.py: Django中的视图层,其中放置的函数供路由系统调用
models.py: Django中的模型层,供视图层调用,用于处理数据持久化,屏蔽相对底层的操做(直接操做SQL语句),固然Django也提供直接执行SQL语句的接口,但不建议你这么干
2. urls.py, views.py, models.py
###########urls.py########### # 当 "urlpatterns" 条目为空或只存在 admin 映射时访问 127.0.0.1 会映射到Django默认主页 from django.contrib import admin from django.urls import path from . import views #存在 views.py 文件时可导入视图文件以使用其中的函数 urlpatterns = [ path('admin/', admin.site.urls), #将.../admin映射到Django管理界面 path('sayHello/', views.sayHello), #调用 sayHello 视图 ] ###########views.py########### # 使用 "django-admin startapp appName" 建立的应用自动生成该文件 from django.shortcuts import render,HttpResponse,redirect #一般使用这3种方式返回 from . import models #如需使用则手动创建该文件 def sayHello(request): return HttpResponse('Hello Django.') ###########models.py########### #使用 "django-admin startapp appName" 建立的应用自动生成该文件 #修改本文件中内容后执行数据迁移指令,自动生成数据库结构映射 from django.db import models # 模型创建示例 class User(models.Model): name=models.CharField(primary_key=True,max_length=16) age=models.IntegerField(default=0)
编写完成后重启服务器,访问 127.0.0.1:8000/sayHello 就能看到结果了
3. 一个使用模板+静态资源的示例,setting.py 中需配置 STATICFILES_DIRS 的值
文件结构
projName
|-- projName<DIR>
|-- __init__.py
|-- settings.py
|-- urls.py
|-- views.py
|-- wsgi.py
|-- static<DIR>
|-- templateTest.css
|-- templateTest.jpg
|-- templateTest.js
|-- templates<DIR>
|-- templateTest
|-- manage.py
##################urls.py################## from django.urls import path from . import views urlpatterns = [ path('<int:pageNum>/',views.template), ] ##################views.py################## from django.shortcuts import render def template(request,pageNum): content={ 'pageNum':pageNum, } return render(request,'templateTest.html',content) ##################templateTest.html################## <!DOCTYPE html> <html> <head> <title>testPage</title> <link rel="stylesheet" type="text/css" href="../static/templateTest.css"> </head> <body> <p>图片显示为圆形则css/图片加载成功</p> <p>弹出对话框则javascript脚本加载成功</p> <p>括号内为地址栏输入的数字({{pageNum}})</p> <img src="../static/templateTest.jpg"> <script type="text/javascript" src="../static/templateTest.js"></script> </body> </html> ##################templateTest.css################## img{ width: 200px; height: 200px; border-radius: 50%; } ##################templateTest.js################## document.onload=alert('调用javascript');
写得有点久了,95%是在作东西的时候写的,到发布的时候已经快一个月时间了,其中有些东西如今也记不大清了;当时没有发布我以为可能有些重要的地方没写完,发布以前我又从新把上面的东西都跑了一次,发现果真是有些东西没写到 0.0
这篇文章可能不是描述的最详细的,但应该是这一套技术比较全面的了,若是有什么问题或建议请回复评论(虽然最后确实头都写晕了 555~)
原创文章,转发请注明