Python3条件搭建

2019-07-25 作者:yzc216亚洲城   |   浏览(105)

阅读目录
1、系统环境,必要知识
2、安装python3.6.5
3、安装uWSGI
4、安装nginx
5、安装Django
6、MySQL安装配置

此文纯粹记录个人在搭建此博客时候遇到的情况。

1、系统环境,必要知识

图片 1nginx、uwsgi、django之间的相互联系图

#cat /etc/RedHat-release
CentOS Linux release 7.5.1804 (Core)
#uname -r
3.10.0-862.3.2.el7.x86_64

ubuntu 16.04 64位

暂时关闭防护墙,关闭selinux:

python 3.5

#systemctl stop firewalld.service
#setenforce 0
#getenforce
Permissive

django 2.0

准备知识:

kindeditor

django:一个基于python的开源web框架。

virtualenv 15.2.0

uWSGI:一个基于自有的uwsgi协议,wsgi协议和http服务协议的web网关

mysql 5.7.21

nginx:高性能的代理web服务器

nginx 1.10.3

wsgi.py:django项目自带的wsgi接口文件(位于:项目/项目名/wsgi.py)

uwsgi

整个项目流程:

主要配置难点在于在django setting.py文件的配置、uwsgi.ini文件配置,nginx配置上。

首先客户端通过浏览器访问服务器资源;nginx作为对外服务的端口(80),nginx接收到客户端http请求后会解包分析,如果是静态文件就去配置的静态文件中查找资源并返回给客户端,如果是动态资源,nginx就通过配置文件将请求传递给uwsgi处理,并转发给uwsgi,wsgi根据请求调用django工程的文件和函数,处理后django将返回值交给wsgi,wsgi将返回值进行打包,转发给uWSGI,uWSGI接收到数据后转发给nginx,最终返回给客户端。

1.若要放在云服务器上部署。

2、安装python3.6.5

ALLOWED_HOSTS = [

(1)安装python依赖包

'{云服务器ip地址}',

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel python-devel

'127.0.0.1',

(2)安装python

]

#wget
#mkdir -p /usr/local/python356
#tar zxvf Python-3.6.5.tgz
#cd Python-3.6.5
#./configure --prefix=/usr/local/python356
#make
#make install
#ln -s /usr/local/python356/bin/python3 /usr/local/bin/python3
#ln -s /usr/local/python356/bin/pip3 /usr/local/bin/pip3
#pip3 install --upgrade pip  #更新pip
#pip3 install ipython  #安装ipython方便调试

首先要对服务器访问ip与web程序进行绑定才可以由云服务器的ip访问web资源。

测试安装是否正常:

2.更改数据库配置。

#python3 -V
Python 3.6.5

数据库在云服务器中使用的是mysql,在此建议在安装了mysql后,将云服务器上安装的mysql配置为可远程访问操控,方便在远程使用第三方工具对数据库进行操控。

#pip3 -V
pip 10.0.1 from /usr/local/python356/lib/python3.6/site-packages/pip (python 3.6)

DATABASES = {

3、安装uWSGI

'default': {

使用python的pip工具包安装:

# 'ENGINE': 'django.db.backends.sqlite3',

#pip3 install uwsgi

# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

#ln -s /usr/local/python356/bin/uwsgi /usr/local/bin/uwsgi  #建立软链接
#uwsgi --version  #检查安装成功
2.0.17

'ENGINE': 'django.db.backends.mysql',

建立uWSGI的配置文件,在django项目中建立uwsgi.ini文件:

'NAME': '{数库名}',

[uwsgi]
socket = 127.0.0.1:9090
chdir = /djproject/mysite
module = mysite.wsgi    #这里填的是相对路径
master = true
processes = 2
threads = 2
max-requests = 2000
vacuum = true
daemonize = /djproject/mysite/uwsgi.log
stats = 127.0.0.1:9001
post-buffering = 65535
buffer-size = 65535
harakiri-verbose = true
harakiri = 300
uid = nginx
pidfile = /djproject/mysite/uwsgi.pid

'USER': '{数据库访问用户}',

参数说明:

'PASSWORD': '{数据库访问密码}',

socket:指定监听地址和端口

'HOST': '{数据库所在的ip地址}',

chdir:指定工程的绝对路径,如Django的项目路径

'PORT': '3306',

module:指定web应用的入口模块,如Django项目下的wsgi.py接口文件

}

master:启动主进程

}

processes:启动进程数

使用时,对数据库依赖安装了有以下:

threads:启动线程数

sudo apt-get build-dep python-lxml

max-requests:最大请求数

pip install PyMSQL

daemonize:指定uWSGI日志文件路径

pip install mysqlclient

stats:指定状态查询端口,如:127.0.0.1:9001

pip install Pollow ### model中ImageField需要的依赖

wsgi-file:指定启动的文件

3.对静态文件和上传文件的更改。

post-buffering:设置缓冲区

django框架下,对静态文件和上传文件是需要进行配置才会有效,要指定访问后缀和文件目录地址,这一切都可以在setting配置中实现。

buffer-size:设置缓冲区文件大小

#设置静态文件目录。其中前端js、css、kindeditor富文本、UI第三方都放在其中

harakiri-verbose:设置超时true为开启

#此地址是指在云服务器上 最后所有的static文件夹都会集中在此目录下 运行命令为

harakiri:设置超时时间

python manage.py collectstatic

uid、gid:设置用户和组

MEDIA_ROOT='/var/www/blog/static/'

pidfile:指定启动时的pid文件路径

STATIC_URL = '/static/' #访问url后缀地址 如 127.0.0.1/static/js/jq.js

uwsgi信号控制:

STATICFILES_DIRS = (

HUP    :优雅的重新加载所有进程和配置,同(--reload)一样

os.path.join(BASE_DIR, "static"), #开发时存放静态文件目录

TERM  :强制重新加载主进程和配置

)

 INT  :立即杀死整个uWSGI;同于:--stop

# 设置媒体文件目录 与上静态文件目录配置说明同理

QUIT  :立即杀死真个uWSGI

MEDIA_URL = '/media/'

重新启动实例:

MEDIA_ROOT ='/var/www/blog/media/'

#kill -HUP `cat /tmp/project-mast.pid`

注:admin的静态文件位置与开发时的静态文件位置不一致,所以MEDIA_ROOT来合并所有的静态文件是很有必要的,这样admin才会有样式。

#uwsgi --reload /tmp/project-master.pid

1.基本知识

还可以在python程序中使用uwsgi.reload()重新加载

wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。

停止服务器:

利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;

#uwsgi --stop /tmp/project-master.pid

uwsgi:同WSGI一样是一种通信协议

#kill -INT `cat /tmp/project-master.pid`

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。

编写启动脚本:

uWSGI :一种python web server或称为Server/Gateway

#vim /etc/init.d/uwsgi

uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。

#!/bin/bash
#this is uwsgi server script

因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。

. /etc/init.d/functions

uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

uwsgi=/usr/local/bin/uwsgi
uwsgi_pid=/djangoproject/mysite/uwsig.pid
uwsgi_conf=/djangoproject/mysite/uwsigconf.ini
uwsgi_pn=`ps -ef|grep -v "grep"|grep -c "uwsgi"`
ERVAL=0
start(){
    $uwsgi --ini $uwsgi_conf >& /dev/unll
    ERVAL=$?
    if [ $ERVAL -eq 0 ];then
        action "uwsgid starting ..." /bin/true
    else
        action "uwsgid start is error" /bin/false
    fi
}

2.项目运行流程

stop(){
    $uwsgi --stop $uwsgi_pid >& /dev/null
    ERVAL=$?
    if [ $ERVAL -eq 0 ];then
        action "uwsgid stoping ..." /bin/true
    else
        action "uwsgid stop is error" /bin/false
    fi
}

..首先客户端请求服务资源,

case "$1" in
    start)
        if [ $uwsgi_pn -ge 5 ];then
            action "uwsgi is running!" /bin/false
        else
            start
            ERVAL=0
        fi
        ;;
    stop)
        if [ $uwsgi_pn -ge 5 ];then
            stop
            ERVAL=0
        else
            action "uwsgi no running!" /bin/false
        fi
        ;;
    reload)
        if [ $uwsgi_pn -ge 5 ];then
            $uwsgi --reload $uwsgi_pid >&/dev/null
            ERVAL=$?
            [ $ERVAL -eq 0 ] && action "uwsgi reloading ..." /bin/true
        else
            action "uwsgi reload error" /bin/false
        fi
        ;;
    restart)
        stop
        sleep 2
        start
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        ERVAL=2
esac
exit $ERVAL

..nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,

 centOS7 system系统服务脚本:

..如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,

#cat uwsgi.service
[Unit]
Description=uwsgi service
After=network.target

.. 如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给 wsgi,

[Service]
Type=forking
PIDFile=/run/uwsgi.pid
ExecStartPre=/usr/bin/rm -f /run/uwsgi.pid
ExecStart=/usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

.. wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,

[Install]
WantedBy=multi-user.target

.. wsgi将返回值进行打包,转发给uWSGI,

测试服务:

.. uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端。

#uwsgi --ini /djproject/mysite/uwsgi.ini    #启动服务

3.实战操作

#ps -ef|grep "uwsgi"  #查看进程
root    103596      1  2 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
root    103598 103596  0 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
root    103599 103596  0 16:02 ?        00:00:00 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini

安装:sudo pip install uwsgi

#netstat -lntp|grep "uwsgi"
tcp        0      0 127.0.0.1:9090          0.0.0.0:*              LISTEN      103596/uwsgi       
tcp        0      0 127.0.0.1:9001          0.0.0.0:*              LISTEN      103596/uwsgi

测试uWSGI: 新建文件test.py,写入以下内容:

看上面进程是少了一个主进程,通过systemctl 查看就清楚了:

def application(env, start_response):

#systemctl status -l uwsgi.service
● uwsgi.service - uwsgi service
  Loaded: loaded (/usr/lib/systemd/system/uwsgi.service; disabled; vendor preset: disabled)
  Active: active (running) since 五 2018-05-25 16:02:06 CST; 4min 14s ago
  Process: 103593 ExecStart=/usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini (code=exited, status=0/SUCCESS)
  Process: 103591 ExecStartPre=/usr/bin/rm -f /run/uwsgi.pid (code=exited, status=0/SUCCESS)
 Main PID: 103596 (uwsgi)
  CGroup: /system.slice/uwsgi.service
          ├─103596 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
          ├─103598 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini
          └─103599 /usr/local/python356/bin/uwsgi --ini /djproject/mysite/uwsgi.ini

start_response('200 OK', [('Content-Type','text/html')])

5月 25 16:02:06 ZPY systemd[1]: Starting uwsgi service...
5月 25 16:02:06 ZPY uwsgi[103593]: [uWSGI] getting INI configuration from /djproject/mysite/uwsgi.ini
5月 25 16:02:06 ZPY systemd[1]: PID file /run/uwsgi.pid not readable (yet?) after start.
5月 25 16:02:06 ZPY systemd[1]: Started uwsgi service.

return "Hello World"

4、安装nginx

运行 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py

这里采用yum安装nginx:

若浏览器显示

yum -y install nginx

图片 2test.py成功相应uwsgi

配置nginx与uwsgi代理:

在project目录下兴建一个uwsgi.ini文件

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

[uwsgi]

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

# Django-related settings

events {
    worker_connections 1024;
}

socket = :8000 # Django项目本地端口

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

chdir = /www/Blog/Blog/ # 项目根目录位置

    access_log  /var/log/nginx/access.log  main;

wsgi-file = /Blog/wsgi.py # wsgi.py文件在项目的中的相对位置

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay        on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

module =Blog.wsgi

    include            /etc/nginx/mime.types;
    default_type        application/octet-stream;

# master

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See
    # for more information.
    include /etc/nginx/conf.d/*.conf;

master = true # 进程设置,无需变动

server {
    listen 80;
    server_name localhost;
    charset    utf-8;
    access_log      /var/log/nginx/nginx_access.log main;
    error_log      /var/log/nginx/nginx_error.log;
    client_max_body_size 75M;

# maximum number of worker processes

    location /static {
        alias /djproject/mysite/static;  #指定django的静态文件
        }

processes = 4 # 启动4个uwsgi进程

    location / {
        include    /etc/nginx/uwsgi_params;  #加载uwsgi模块
        uwsgi_pass  127.0.0.1:9090;  #所有请求转到9090端口交给uwsgi处理
        }
    }

# ... with appropriate permissions - may be needed

}

# chmod-socket = 664

5、安装Django

# clear environment on exit

#pip3 install django

vacuum = true

#ln -s /usr/local/python356/bin/django-admin /usr/local/bin/django-admin

pidfile=uwsgi.pid

创建项目:

daemonize=uwsgi.log

#django-admin startproject mysite

图片 3uwsgi.ini文件配置

创建app:

1.作用:

#cd mysite/
#django-admin startapp app01

1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;

先建立个测试文件:

  1. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;

#cat settings.py
ALLOWED_HOSTS = ['192.168.146.139']  #添加本地IP,外网访问

3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成 uWSGI的负载均衡;

#cat urls.py
from django.contrib import admin
from django.urls import path
from app01 import views  #导入app01视图
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index,name='index'),  #添加路由
]

4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

#cat ../app01/views.py
from django.shortcuts import render
from django.http import HttpResponse

2.实战配置

# Create your views here.

nginx的配置文件在ubuntu中位置为 /etc/nginx/nginx.conf

def index(request):    #添加视图函数
  return HttpResponse('hello world')

而我们要写入的服务配置在 /etc/nginx/sites-enabled/default

重新加载uwsgi:

upstream django {

#uwsgi --reload uwsgi.pid

# 设置本地服务的端口

访问:  能显示“hello world”说明环境部署成功了。

server 127.0.0.1:8000; # for a web port socket (we'll use this first)

(1)配置Django模版文件的使用:

}

首先必须在项目的setting文件中配置templates模版文件的搜索路径;找到TEMPLATES项,在DIRS中写入模版搜索路径:

# configuration of the server

'DIRS': [os.path.join(BASE_DIR,'templates')],  #此处为项目目录下的templates

server {

配置home路由,在视图中使用render渲染模版文件,然后建立模版文件进行测试。

# 监听主机的端口

#vim app01/views.py
def home(request):
  return render(request,'app01/home.html')

listen 80;

#vim mysite/urls.py
urlpatterns = [
    path('home/',views.home),
]

# the domain name it will serve for

#mkdir -p templates/app01
#vim templates/app01/home.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<h1>this is test file</h1>
</body>
</html>

# server_name .liqian.ink; # substitute your machine's IP address or FQDN

测试:

charset utf-8;

(2)配置djando静态文件加载

# max upload size

首先在django的项目文件中,打开setting.py,找到STATIC_URL填写搜索路径

client_max_body_size 75M; # adjust to taste

#STATIC_URL = '/static/'  #在linux下这两种写法都可以,在windows系统下必须两种都要写上,不知何解!
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
)

# 设置媒体文件目录

#在模块中引入静态文件时,必须是/static,此静态文件在项目下面
<script src="/static/jquery-3.3.1.js"></script>

# Django media

6、MySQL安装配置

location /media {

#下载二进制包安装
wget
tar zxvf mysql-5.5.32-linux2.6-x86_64.tar.gz
mv mysql-5.5.32-linux2.6-x86_64 /usr/local/mysql-5.5.32
ln -s /usr/local/mysql-5.5.32 /usr/local/mysql
useradd -s /sbin/nologin -M mysql
mkdir /mysql/data -p
chown -R mysql.mysql /mysql/data
cd /usr/local/mysql
#添加配置文件和启动脚本
cp support-files/my-small.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
#初始化数据库
./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mysql/data/
echo $?

alias /var/www/blog/media; # your Django project's media files - amend as required

#修改启动脚本路径
sed -i 's#^basedir=#basedir=/usr/local/mysql#g' /etc/init.d/mysqld
sed -i 's#^datadir=#datadir=/mysql/data#g' /etc/init.d/mysqld
chmod x /etc/init.d/mysqld
#启动和关闭MySQL
/etc/init.d/mysqld start
/etc/init.d/mysqld stop
#方法2:
/usr/local/mysql/bin/msyql_safe &    #后台启动
mysqladmin shutdown  #优雅关闭MySQL服务
#查看运行状态
#netstat -lntup|grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*              LISTEN      70099/mysqld       

}

#添加系统自启动
chkconfig --add mysqld
chkconfig --level 345 mysqld on
#添加环境变量
echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
source /etc/profile

# 设置静态文件目录

#修改初始化密码
mysqladmin -uroot password '123456'

location /static {

#建立一个数据库,后面要用到
MySQL [(none)]> create database django;
Query OK, 1 row affected (0.00 sec)

alias /var/www/blog/static; # your Django project's static files - amend as required

(1)配置Django链接MySQL:

}

在setting中,Django默认使用的是sqlite数据库:

# Finally, send all non-media requests to the Django server.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

location / {

修改成MySQL数据库配置:

uwsgi_pass django;

DATABASES = {
        'default':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'root',
        'PASSWORD': '123.com',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        }
}

include uwsgi_params; # the uwsgi_params file you installed

ENGINE : 指定数据库驱动,不同的数据库这个字段不同,下面是常见的集中数据库的ENGINE的写法:

}

django.db.backends.postgresql  # PostgreSQL 
django.db.backends.mysql      # mysql 
django.db.backends.sqlite3    # sqlite 
django.db.backends.Oracle      # oracle

}

NAME: 指定的数据库名,如果是sqlite的话,就需要填数据库文件的绝对位置

图片 4nginx配置文件写入

USER: 数据库登录的用户名,mysql一般都是root

1.注意事项

PASSWORD:登录数据库的密码,必须是USER用户所对应的密码

每次修改了Django项目中的模板/视图/URL/配置文件,都需要重启uwsgi服务。

HOST: 由于一般的数据库都是C/S结构的,所以得指定数据库服务器的位置,我们一般数据库服务器和客户端都是在一台主机上面,所以一般默认都填127.0.0.1

修改Nginx配置文件,都需要重启Nginx服务。

PORT:数据库服务器端口,mysql默认为3306

启动:uwsgi --ini uwsgi.ini

HOST和PORT都可以不填,使用默认的配置,但是如果你有更改默认配置的话,就需要填入更改后的

停止:uwsgi --stop uwsgi.pid

配置完这,下面就需要装python连接mysql数据库的驱动程序,首先,需要安装mysql的开发包

重启:uwsgi --reload uwsgi.pid

#yum install mysql-devel  #安装MySQL插件
#pip3 install mysqlclient    #安装MySQL驱动

强制停止:killall -9 uwsgi

(2)通过template模版与MySQL实现简单表单交互

nginx -s reload; nginx重启 但自己常使用 service nginx start/restart/stop

在app目录下的models文件中创建model类用于生成数据表:

2.文件权限处理

#cat app01/models.py
from django.db import models

是ubuntu下要先创建关于django web project的静态文件目录和上传文件目录,要保证

# Create your models here.

修改目录权限:sudo chmod 777 /var/www/xxxx

class userinfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    age = models.IntegerField()
    salary = models.IntegerField()

创建static目录,注意顺序是先分配权限,再创建目录:mkdir static

设置setting.py文件,将app加入到INSTALLED_APPS中:

 INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01'
        ]

根据model类创建数据库表:

#cmd进入django项目路径下
#python manage.py migrate #创建表结构,非model类的其他表,django所需要的
#python manage.py makemigrations app名 #做数据迁移的准备
如:python manage.py makemigrations app01 app01是项目中的app名字
#python manage.py migrate # 执行迁移,创建medel表结构

在templages下建立模版文件:

#cat templates/app01/home.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
    body{
        background-image: url('/static/78556.jpg');
    }
    </style>
</head>
<body>
<form action="" method="post">  #提交数据给自身
      <p><input type="text" name="username"/></p>
      <p><input type="text" name="password"/></p>
      <p><input type="text" name="age"/></p>
      <p><input type="text" name="salary"/></p>
      <p><input type="submit" value="提交"/></p>
</form>
<table border="1">
  <thead>
      <tr>
                <th>用户名</th>
                <th>密码</th>
                <th>年龄</th>
                <th>工资</th>
      </tr>
  </thead>
            <tbody>
                {% for item in data %} #循环获取传入字典数据
                <tr>
                    <td>{{item.name}}</td>
                    <td>{{item.password}}</td>
                    <td>{{item.age}}</td>
                    <td>{{item.salary}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>

<h1>this is test file</h1>
<script src="/static/jquery-3.3.1.js"></script>
</body>
</html>

在app下新建视图函数,与数据库交互:

#cat app01/views.py

from django.shortcuts import render
from django.http import HttpResponse
from app01 import models  #引入数据类模版
# Create your views here.

def home(request):  #创建home函数处理请求
  if request.method == "POST":  #判断是否为post提交
    #print(request.POST)
    models.userinfo.objects.create(    #提交表单的数据到数据库
    name = request.POST['username'],
    password = request.POST['password'],
    age = request.POST['age'],
    salary = request.POST['salary'],
)
  data = models.userinfo.objects.all()  #获取数据库数据
  return render(request,'app01/home.html',{'data':data}) #渲染模版文件并传递数据库表给模版

#此处是以post方式提交,需要修改Django项目setting设置中的MIDDLEWARE,将csrf安全机制注销了:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

#建立路由:

#cat mysite/urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/',views.home),
]

重新启动uWSGI:

#uwsgi --stop uwsgi.pid
#uwsgi --ini uwsgi.ini

#浏览器访问:

#提交数据到数据库后并返回给浏览器客户端

图片 5

本文永久更新链接地址

图片 6

本文由yzc216亚洲城发布于yzc216亚洲城,转载请注明出处:Python3条件搭建

关键词: yzc216亚洲城