wsgi

转载自:https://segmentfault.com/a/1190000011365430 1. WSGI介绍 1.1 什么是WSGI 首先介绍几个关于WSGI相关的概念 WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python 模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Torando,Flask,Django uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。 uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。 WSGI协议主要包括server和application两部分: WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端; WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。 WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和applicatiodn组合实现自己的web应用。例如uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的web框架,可以根据项目实际情况搭配使用。 以上介绍了相关的常识,接下来我们来看看如何简单实现WSGI协议。 1.2 怎么实现WSGI 上文说过,实现WSGI协议必须要有wsgi server和application,因此,我们就来实现这两个东西。 我们来看看官方WSGI使用WSGI的wsgiref模块实现的小demo def demo_app(environ,start_response): from StringIO import StringIO stdout = StringIO() print >>stdout, "Hello world!" print >>stdout h = environ.items(); h.sort() for k,v in h: print >>stdout, k,'=', repr(v) start_response("200 OK", [('Content-Type','text/plain')]) return [stdout....

April 9, 2021 · 3 min · 李昌

Django,Forms

Django, Forms 使用forms完成了用户登录 1、创建model class User(User): pass 这里使用了django提供的User类,直接继承 2、创建UserForm类 class SigninFrom(forms.Form): user_name = forms.CharField() user_email = forms.EmailField() user_password = forms.CharField() 3、完成模板 <form action="{% url 'permission:signin' %}" accept-charset="UTF-8" method="post"> <input name="utf8" type="hidden" value="&#x2713;"/> {% csrf_token %} <dl class="form-group mt-0"> <dt class="input-label"> <label class="form-label f5" for="user[login]">用户名</label> </dt> <input type="text" name="user_name" id="user_name" class="form-control form-control-lg input-block" placeholder="{{ default_name }}" autofocus> </dl> <dl class="form-group"> <dt class="input-label"> <label class="form-label f5" for="user[email]">Email</label> </dt> <dd> <input type="text" name="user_email" id="user_email" class="form-control form-control-lg input-block js-email-notice-trigger" placeholder="you@example....

February 25, 2021 · 2 min · 李昌

django中forms的定义

django中forms的定义 直接定义 class ContactForm(forms.Form): date = DateField(widget=CalendarWidget) name = CharField(max_length=40, widget=OtherWidget) widget参数定义了要使用的小部件,小部件选项可见这里 通过模型定义 必须继承ModelForm类 from django.forms import ModelForm class BlogForm(ModelForm): class Meta: model = Blog fields = ['author', 'essay', 'title', 'label', 'cover'] widgets = { 'essay': CKEditorWidget, 'cover': } 通过定义内部类来生命form的属性 常用内部类参数说明: model: 说明要继承的模型 field:说明要在表单中显示的字段,__all__表示所有 exclude: 要从表单中排除的字段 widgets: 设置字段的小部件 (详细文档)

February 25, 2021 · 1 min · 李昌

django中使用highchart

django中使用highchart 引入js文件 顺序不能错 <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <script src="https://code.highcharts.com/highcharts.js"></script> 一点小插曲 在刚开始使用highchart时,由于使用的是继承模板,导致js文件引入的顺序没有把握好,导致不能显示图像,因此将上面两句提到base.html的前面,然后可以显示图像。

February 25, 2021 · 1 min · 李昌

Django中图像的处理方法

Django 中图像的处理方法 图像的上传保存 前端图片的上传: <form action="/updateinfo" method="POST" enctype="multipart/form-data"> <div class="updateImg"> <img src="{{ account.photo.url }}" alt=""/> </div> <input name="photo" type="file" id="exampleInputFile"> <button id="photo" class="btn btn-danger" type="submit">上传头像</button> </form> 其中input标签的type为file, 2. 图片模型 models.ImageField(upload_to=‘path’) upload_to的储存路径是相对于MEDIA_ROOT而来的,若MEDIA_ROOT为/media/,upload_to路径为image,则图片上传后的储存路径为/media/image 在前端显示上传的图片 {% load static %} <body data-media-url="{% get_media_prefix %}"> 使用get_media_prefxi模板tag,代表MEDIA_URL变量 <img src="{% get_media_prefix %}/{{ page.cover }}" alt = "{{ page.cover }}"> 存在的问题 每个用户上传的图片集中在一个文件夹下,容易造成命名冲突, 可参考这里

February 25, 2021 · 1 min · 李昌

HINT : Add or change are lated_name

HINT: Add or change a related_name 解决方案: 需要在setting中重载AUTH_USER_MODEL AUTH_USER_MODEL = ‘users.UserProfile’ users:你的app UserProfile:model

February 25, 2021 · 1 min · 李昌

python与其他语言的对比(helloworld)

python与其他语言的对比(hello world) C语言 include<stdio.h> int main() { printf("hello world"); return 0; } Java语言 public class HelloWorld{ public static void main(String[] args) { System.out.println("Hello World!"); } } Python print('hello world') python中的常用数据类型 Number String List Tuple Dictionary # Number a = 1 b = True c = 3.15 d = 1.1+2.2j # 字符串 str1 = 'hello' str1_1 = "hello" str2 = "world" print(str1==str1_1) # 字符串连接 str3 = str1 + str2 print(str3) # 转义字符 str4 = 'hello \nworld' print(str4) str5 = 'hello \\n world' print(str5) # 格式化输出 print('str1:%s....

February 25, 2021 · 3 min · 李昌

在docker中构建django项目

在docker中构建django项目 (需安装docker-compose, 安装教程) 1. 定义项目组件 对于此项目,您需要创建Dockerfile,Python依赖项文件和docker-compose.yml文件。(您可以使用此文件的扩展名.yml或.yaml扩展名。) 1.1. 创建一个空目录 该目录应仅包含构建该映像的资源。 1.2 创建Dockerfile 内容如下: FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/ 对于DockerFile的解释 1.3 创建requirements.txt 内容如下: django django-ckeditor pillow numpy 1.4 创建docker-compose.yml 该docker-compose.yml文件描述了构成应用程序的服务。在此示例中,这些服务是Web服务器和数据库。撰写文件还描述了这些服务使用哪些Docker映像,它们如何链接在一起,以及它们可能需要安装在容器内的任何卷。最后,该docker-compose.yml文件描述了这些服务公开的端口。有关此文件如何工作的更多信息,请参阅docker-compose.yml参考。 内容如下: version: '3' services: db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db 2 创建django项目 切换到项目跟目录】 通过运行docker-compose run 命令创建django项目 sudo docker-compose run web django-admin startproject mysite ....

February 25, 2021 · 1 min · 李昌

网页静态文件找不到

网页静态文件找不到 在19-2-18的开始,突然发现网页的静态文件找不到了 在将static目录移动到app目录内之后,发现网页可以正常显示。 原来static目录是和app目录一个层级 针对此问题的思考 STATIC_URL = ‘/static/’ 注意此处是url,即对于静态文件的定位,这是必要的前提配置 STATIC_URL的定义制定了静态资源的url,具体指各个app下的static目录 STATIC_ROOT = os.path.join(BASE_DIR, “static”) STATIC_ROOT是总的static目录,主要用于在运行 collectstatic命令时存储所有的静态文件 STATICFILES_DIRS = [os.path.join(BASE_DIR, “static”), ‘mysite/static’,] STATICFILES_DIRS是一个列表,存放各个app的static目录及公共的static目录 ​ 官网配置 确保django.contrib.staticfiles包含在您的 INSTALLED_APPS。 在您的设置文件中,定义STATIC_URL,例如: STATIC_URL = '/static/' 在模板中,使用static模板标记使用已配置的相对路径构建URL STATICFILES_STORAGE。 {% load static %} <img src="{% static "my_app/example.jpg" %}" alt="My image"/> 将静态文件存储static在应用程序中调用的文件夹中。例如my_app/static/my_app/example.jpg。 对于模板中的{% load static%} 当在模板中使用过load static之后,再次使用static时,将会使用STATICFILES_FINDERS寻找静态文件,其默认值为: [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ] 对此的解释是,将会从STATICFILES_DIRS的目录中以及每个app下的static目录中寻找静态文件。 在url后加入+ static(settings.MEDIA_URL, document_root=settings....

February 25, 2021 · 1 min · 李昌