django是python语言快速实现web服务的大杀器,其开发效率可以非常的高!但因为秉承了语言的灵活性,django框架又太灵活,以至于想实现任何功能都有种“条条大路通罗马”的感觉。这么多种选择放在一起,如何分出高下?我想此时的场景下就两个标准:1、相同的功能用最少的代码实现(代码少BUG也会少);2、相对最易于理解,从而易于维护和扩展。书归正传,web服务允许用户输入,基本上要靠表单。而django对表单的支持力度非常大,我们用不着在浏览器端的html文件里写大量
1、django基础表单的功能
定义一个表单非常简单,继承类django.forms.Form即可,例如:
class ProjectForm(forms.Form): name = forms.CharField(label='项目名称', max_length=20)
看下django.forms.Form定义:
class Form(six.with_metaclass(DeclarativeFieldsMetaclass, BaseForm)): "A collection of Fields, plus their associated data." # This is a separate class from BaseForm in order to abstract the way # self.fields is specified. This class (Form) is the one that does the # fancy metaclass stuff purely for the semantic sugar -- it allows one # to define a form using declarative syntax. # BaseForm itself has no way of designating self.fields.
我们重点关注表单的BaseForm类,它实现了基本的逻辑。截选了一小段对接下来的陈述有意义的代码,做一个简单的注释。
class BaseForm(object): def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None): #data参数用于接收request.POST字典,如果是GET方法就不传 self.data = data or {} #files用于接收request.FILES,也就是处理上传文件 self.files = files or {} #本篇文章的重点在于多个表单集成到一个form中,此时为防止有同名的field,需要加prefix前缀 if prefix is not None: self.prefix = prefix #GET显示表单时,如果要显示初始值,请用initial参数 self.initial = initial or {} #模板中显示{{form}}时,默认是以显示的 def __str__(self): return self.as_table() #如果模板中不想写重复代码,只以固定的格式来显示每一个field,那么就用{% for field, val in form %}来遍历处理吧 def __iter__(self): for name in self.fields: yield self[name] #如果传入了prefix参数,html中每个field的name和id里都会加上prefix前缀 def add_prefix(self, field_name): return '%s-%s' % (self.prefix, field_name) if self.prefix else field_name #模板中以html格式显示form就靠这个方法 def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row): "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()." top_errors = self.non_field_errors() # Errors that should be displayed above all fields. output, hidden_fields = [], [] #除了默认的table方式显示外,还可以或者方式显示 def as_table(self): "Returns this form rendered as HTML s -- excluding the ." def as_ul(self): "Returns this form rendered as HTML s -- excluding the ." def as_p(self): "Returns this form rendered as HTML s." 所以,基本表单的功能看BaseForm已经足够了。 2、从模型创建表单 django对于MVC中的C与M间的映射是非常体贴的,集中体现中Model模型中(比如模型的权限与用户认证)。那么,一个模型代表着RDS中的一张表,模型的实例代表着关系数据库中的一行,而form如何与一行相对应呢? 定义一个模型引申出的表单非常简单,例如: class ProjectForm(ModelForm): class Meta: model = Project fields = ['approvals','manager','name','fund_rource','content','range',] 在model中告诉django模型是谁,在fields中告诉django需要在表单中创建哪些字段。django会有一个django.db.models.Field到django.forms.Field的转换规则,此时会生成Form。我们看看ModelForm是什么样的: class ModelForm(six.with_metaclass(ModelFormMetaclass, BaseModelForm)): pass类似Form类,ModelFormMetaclass就是语法糖,我们重点看BaseModelForm类: class BaseModelForm(BaseForm): def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None): opts = self._meta #相比较BaseForm,多了instance参数,它等价于Model模型的一个实例 if instance is None: #不传instance参数,则会新构造model对象 self.instance = opts.model() object_data = {} else: self.instance = instance object_data = model_to_dict(instance, opts.fields, opts.exclude) #此时传递了initial也一样可以生效,同时还会设置到Model中 if initial is not None: object_data.update(initial) def save(self, commit=True): #默认commit是True,此时就会保存Model实例到数据库 if commit: self.instance.save() #同时保存many-to-many字段对应的关系表 self._save_m2m() else: #注意,本篇文章主要用到commit=False这个参数,它会返回Model实例,允许我们在修改instance后,在instance上再调用save方法 self.save_m2m = self._save_m2m return self.instance 所以,对于ModelForm我们可以传入instance参数初始化表单,可以调用save()方法直接将从html里得到的表单数据持久化到数据库中。而我们只需要几十行代码就可以完成这么多工作。 3、通用视图 django.views.generic.ListView和django.views.generic.edit下的CreateView, UpdateView, DeleteView都是通用视图。即,我们又可以通过它们,把很多重复的工作交给django完成,又可以少写很多代码完成同样的功能了。这里仅以CreateView为例说明,因为它相对最复杂,接下来的多ModelForm的提交也是在CreateView上进行的。 通用视图使用时,只需要承继后,再设置model或者form_class即可。比如CreateView就会由django自动的把页面上POST出的form数据解析到model生成的表单(或者form_calss指定的ModelForm类型表单),同时调用表单的save方法将数据添加到模型对应的数据库表中。当然GET请求时会生成空form到页面上。可以看到,除去定义model或者form类外,几行代码就可以搞定这么多事。我们看看CreateView的继承关系: 简单介绍下CreateView通用视图中每个父类的作用。 View是所有视图类的父类,根据方法名分发请求到具体的get或者post等方法,提供as_view方法。 TemplateResponseMixin提供render_to_response方法将响应通过context上下文在模板上渲染。 ContextMixin在context上下文中加入'view'元素,值为self实例。 ProcessFormView在GET请求上渲染表单,在POST请求上解析form到表单实例。注意,它会在post请求中判断表单是否可用,is_valid为真时,会调用form_valid方法,因此,重写form_valid方法是第4部分处理多model到一个form的关键。 FormMixin允许处理表单,可指定form_class为某个表单。 SingleObjectMixin生成context上下文,同时根据model模型名称生成object并添加到上下文中的'object'元素。 ModelFormMixin提供在请求中处理modelform的方式。 SingleObjectTemplateResponseMixin帮助TemplateResponseMixin提供模板。 所以,在用CreateView、一个模型、一个模板实现添加一行记录的功能时是多么简单,因为这些父类会自动生成object,渲染到模板,解析form表单,save到数据库中。所以,从模型创建出的表单ModelForm,配合上通用视图后,威力巨大!! 4、多个ModelForm在一个form里提交 终于可以回到本文的主题了。CreateView默认是处理一个Model模型、一个ModelForm表单的,然而,很多时候为了解耦,会把一张表拆成多张表,通过id关联在一起。在django的模型中就体现为ForeignKey、ManyToManyField或者OneToOneField。而在业务逻辑上,需要体现为一张表单,对应着数据库里的多张表。 例如,我们希望录入合同,其中合同Model中还有地址Model和项目Model,而项目Model中又有地址Model,等等。 当然,我们有很多种实现的方案,但是,前面三部分说了那么多,不是浪费口水的。我们已经有了通用视图+ModelForm这样的利器,难道还需要手动去写Form表单?我们已经习惯了在Model里定义好类型和有点注释作用还能当label的verbose_name,还需要在forms.Form里再来一遍?还需要在视图中写这么通用的逻辑代码吗?当然不用。 inlineformset_factory是一种方案,但它限制太多,而且有些晦涩,我个人感觉是不太好用的。 那么,从第1部分我介绍的Form里的prefix,以及第3部分里类图中的ProcessFormView允许重定义form_valid,以及第2部分中ModelForm的save方法的行为控制,解决方案已经一目了然了。 拿上面提到的例子来说,我们创建合同时,指明了项目,包括项目地址和合同签订地址,这涉及到三张表和四条记录(地址表有两条)。 我们三张表的模型如下: class PrimeContract(models.Model): address = models.ForeignKey(Address, related_name="prime_contract_address", verbose_name="address") project = models.ForeignKey(Project, related_name="prime_contract", verbose_name="project") class Project(models.Model): address = models.ForeignKey(Address, related_name="project_address", verbose_name="project address") class Address(models.Model): pass 接着,定义ModelForm表单,这非常简单: class AddressForm(ModelForm): class Meta: model = Address fields = ... class ProjectForm(ModelForm): class Meta: model = Project fields = ... class PrimeContractForm(ModelForm): class Meta: model = PrimeContract fields = ... 再写视图,这里要重写2个方法: class PrimeContractAdd(CreateView): success_url = ... template_name = ... form_class = PrimeContractForm def get_context_data(self, **kwargs): context = super(PrimeContractAdd, self).get_context_data(**kwargs) #SingleObjectMixin父类只会处理PrimeContractForm表单,另外三条数据库记录对应的表单我们要自己处理了,此时prefix派上用场了,因为Field重名是百分百的事 if self.request.method == 'POST': contractAddressForm = AddressForm(self.request.POST, prefix='contractAddressForm') projectAddressForm = AddressForm(self.request.POST, prefix='projectAddressForm') projectForm = ProjectForm(self.request.POST, prefix='projectForm') else: contractAddressForm = AddressForm(prefix='contractAddressForm') projectAddressForm = AddressForm(prefix='projectAddressForm') projectForm = ProjectForm(prefix='projectForm') #注意要把自己处理的表单放到context上下文中,供模板文件使用 context['contractAddressForm'] = contractAddressForm context['projectAddressForm'] = projectAddressForm context['projectForm'] = projectForm return context #重写form_valid,父类ProcessFormView会在PrimeContractForm表单is_valid方法返回True时调用该方法 def form_valid(self, form): #首先我们要获取到PrimeContractForm表单对应的模型,此时是不能save的,因为外键project和address对应的数据库记录还没有创建,所以commit传为False contract = form.save(commit=False) #获取上面get_context_data方法中在POST里得到的表单 context = self.get_context_data() #按照四条数据库记录的顺序依次的创建(调用save方法)、主键赋到下一条记录的外键中、下一次记录创建(save) projectAddress = context['projectAddressForm'].save() #从项目表单中获取到模型,先把地址的id赋到外键上再保存 project = context['projectForm'].save(commit=False) project.address = projectAddress project.save() contractAddress = context['contractAddressForm'].save() #将合同模型中的address和project都设置好后再保存 contract.address = contractAddress contract.project = project contract.save() return super(PrimeContractAdd, self).form_valid(form) 最后写模板: #这三个表单我们手动处理过的 {{ contractAddressForm }} {{ projectAddressForm }} {{ projectForm }} #这是FormMixin父类帮我们生成的 {{ form }} 至此,我们可以只用几十行代码就完成复杂的功能,代码逻辑也清晰可控。 从这篇文章里也可以看得出,django实在是快速开发网站的必备神器!当然,快速不代表不能够支撑大并发的应用,instagram这个很火的服务就是用django写的。由于python和django过于灵活,都将要求django的开发者们唯有更资深才能写出生产环境下的服务。 你可能感兴趣的:(技术分享,django,python) 理解Gunicorn:Python WSGI服务器的基石 范范0825 ipythonlinux运维 理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico Python数据分析与可视化实战指南 William数据分析 pythonpython数据 在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学 python os.environ 江湖偌大 python深度学习 os.environ['TF_CPP_MIN_LOG_LEVEL']='0'#默认值,输出所有信息os.environ['TF_CPP_MIN_LOG_LEVEL']='1'#屏蔽通知信息(INFO)os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#屏蔽通知信息和警告信息(INFO\WARNING)os.environ['TF_CPP_MIN_LOG_LEVEL']=' Python中os.environ基本介绍及使用方法 鹤冲天Pro #Pythonpython服务器开发语言 文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi Pyecharts数据可视化大屏:打造沉浸式数据分析体验 我的运维人生 信息可视化数据分析数据挖掘运维开发技术共享 Pyecharts数据可视化大屏:打造沉浸式数据分析体验在当今这个数据驱动的时代,如何将海量数据以直观、生动的方式展现出来,成为了数据分析师和企业决策者关注的焦点。Pyecharts,作为一款基于Python的开源数据可视化库,凭借其丰富的图表类型、灵活的配置选项以及高度的定制化能力,成为了构建数据可视化大屏的理想选择。本文将深入探讨如何利用Pyecharts打造数据可视化大屏,并通过实际代码案例 Python教程:一文了解使用Python处理XPath 旦莫 Python进阶python开发语言 目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代 python os.environ_python os.environ 读取和设置环境变量 weixin_39605414 pythonos.environ >>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA 使用Faiss进行高效相似度搜索 llzwxh888 faisspython 在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss python是什么意思中文-在python中%是什么意思 编程大乐趣 Python中%有两种:1、数值运算:%代表取模,返回除法的余数。如:>>>7%212、%操作符(字符串格式化,stringformatting),说明如下:%[(name)][flags][width].[precision]typecode(name)为命名flags可以有+,-,''或0。+表示右对齐。-表示左对齐。''为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填 Day1笔记-Python简介&标识符和关键字&输入输出 ~在杰难逃~ Pythonpython开发语言大数据数据分析数据挖掘 大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程 python八股文面试题分享及解析(1) Shawn________ python #1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变 每日算法&面试题,大厂特训二十八天——第二十天(树) 肥学 ⚡算法题⚡面试题每日精进java算法数据结构 目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章 Python快速入门 —— 第三节:类与对象 孤华暗香 Python快速入门python开发语言 第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name pyecharts——绘制柱形图折线图 2224070247 信息可视化pythonjava数据可视化 一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据 Python 实现图片裁剪(附代码) | Python工具 剑客阿良_ALiang 前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码 【华为OD技术面试真题 - 技术面】- python八股文真题题库(4) 算法大师 华为od面试python 华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法 python os 环境变量 CV矿工 python开发语言numpy 环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类 Python爬虫解析工具之xpath使用详解 eqa11 python爬虫开发语言 文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门 【华为OD技术面试真题 - 技术面】- python八股文真题题库(1) 算法大师 华为od面试python 华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选1.数据预处理流程数据预处理的主要步骤工具和库2.介绍线性回归、逻辑回归模型线性回归(LinearRegression)模型形式:关键点:逻辑回归(LogisticRegression)模型形式:关键点:参数估计与评估:3.python浅拷贝及深拷贝浅拷贝(Shal nosql数据库技术与应用知识点 皆过客,揽星河 NoSQLnosql数据库大数据数据分析数据结构非关系型数据库 Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快) 《Python数据分析实战终极指南》 xjt921122 python数据分析开发语言 对于分析师来说,大家在学习Python数据分析的路上,多多少少都遇到过很多大坑**,有关于技能和思维的**:Excel已经没办法处理现有的数据量了,应该学Python吗?找了一大堆Python和Pandas的资料来学习,为什么自己动手就懵了?跟着比赛类公开数据分析案例练了很久,为什么当自己面对数据需求还是只会数据处理而没有分析思路?学了对比、细分、聚类分析,也会用PEST、波特五力这类分析法,为啥 Python中深拷贝与浅拷贝的区别 yuxiaoyu. 转自:http://blog.csdn.net/u014745194/article/details/70271868定义:在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复 Python开发常用的三方模块如下: 换个网名有点难 python开发语言 Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机 Python编译器 鹿鹿~ Python编译器Pythonpython开发语言后端 嘿嘿嘿我又来了啊有些小盆友可能不知道Python其实是有编译器的,也就是PyCharm。你们可能会问到这个是干嘛的又不可以吃也不可以穿好像没有什么用,其实你还说对了这个还真的不可以吃也不可以穿,但是它用来干嘛的呢。用来编译你所打出的代码进行运行(可能这里说的有点不对但是只是个人认为)现在我们来说说PyCharm是用来干嘛的。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Pyt 一文掌握python面向对象魔术方法(二) 程序员neil pythonpython开发语言 接上篇:一文掌握python面向对象魔术方法(一)-CSDN博客目录六、迭代和序列化:1、__iter__(self):定义迭代器,使得类可以被for循环迭代。2、__getitem__(self,key):定义索引操作,如obj[key]。3、__setitem__(self,key,value):定义赋值操作,如obj[key]=value。4、__delitem__(self,key):定义 一文掌握python常用的list(列表)操作 程序员neil pythonpython开发语言 目录一、创建列表1.直接创建列表:2.使用list()构造器3.使用列表推导式4.创建空列表二、访问列表元素1.列表支持通过索引访问元素,索引从0开始:2.还可以使用切片操作访问列表的一部分:三、修改列表元素四、添加元素1.append():在末尾添加元素2.insert():在指定位置插入元素五、删除元素1.del:删除指定位置的元素2.remove():删除指定值的第一个匹配项3.pop(): Python实现简单的机器学习算法 master_chenchengg pythonpython办公效率python开发IT Python实现简单的机器学习算法开篇:初探机器学习的奇妙之旅搭建环境:一切从安装开始必备工具箱第一步:安装Anaconda和JupyterNotebook小贴士:如何配置Python环境变量算法初体验:从零开始的Python机器学习线性回归:让数据说话数据准备:从哪里找数据编码实战:Python实现线性回归模型评估:如何判断模型好坏逻辑回归:从分类开始理论入门:什么是逻辑回归代码实现:使用skl python中的深拷贝与浅拷贝 anshejd70787 python 深拷贝和浅拷贝浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变。1、对象的赋值对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。当对对象做赋值或者是参数传递或者作为返回值的时候,总是传递原始对象的引用,而不是一个副本。如下所示:>>>aList=["kel","abc",123]>>>bLis 用Python实现简单的猜数字游戏 程序媛了了 python游戏java 猜数字游戏代码:importrandomdefpythonit():a=random.randint(1,100)n=int(input("输入你猜想的数字:"))whilen!=a:ifn>a:print("很遗憾,猜大了")n=int(input("请再次输入你猜想的数字:"))elifna::如果玩家猜的数字n大于随机数字a,则输出"很遗憾,猜大了",并提示玩家再次输入。elifn 用Python实现读取统计单词个数 程序媛了了 python游戏java 完整实例代码:fromcollectionsimportCounterdefpythonit():danci={}withopen("pythonit.txt","r",encoding="utf-8")asf:foriinf:words=i.strip().split()forwordinwords:ifwordnotindanci:danci[word]=1else:danci[word]+= 集合框架 天子之骄 java数据结构集合框架 集合框架 集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。 从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。 简单介绍: Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi Table Driven(表驱动)方法实例 bijian1013 javaenumTable Driven表驱动 实例一: /** * 驾驶人年龄段 * 保险行业,会对驾驶人的年龄做年龄段的区分判断 * 驾驶人年龄段:01-[18,25);02-[25,30);03-[30-35);04-[35,40);05-[40,45);06-[45,50);07-[50-55);08-[55,+∞) */ public class AgePeriodTest { //if...el Jquery 总结 cuishikuan javajqueryAjaxWebjquery方法 1.$.trim方法用于移除字符串头部和尾部多余的空格。如:$.trim(' Hello ') // Hello2.$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。如:$.contains(document.documentElement, document.body); 3.$ 面向对象概念的提出 麦田的设计者 java面向对象面向过程 面向对象中,一切都是由对象展开的,组织代码,封装数据。 在台湾面向对象被翻译为了面向物件编程,这充分说明了,这种编程强调实体。 下面就结合编程语言的发展史,聊一聊面向过程和面向对象。 c语言由贝尔实 linux网口绑定 被触发 linux 刚在一台IBM Xserver服务器上装了RedHat Linux Enterprise AS 4,为了提高网络的可靠性配置双网卡绑定。 一、环境描述 我的RedHat Linux Enterprise AS 4安装双口的Intel千兆网卡,通过ifconfig -a命令看到eth0和eth1两张网卡。 二、双网卡绑定步骤: 2.1 修改/etc/sysconfig/network XML基础语法 肆无忌惮_ xml 一、什么是XML? XML全称是Extensible Markup Language,可扩展标记语言。很类似HTML。XML的目的是传输数据而非显示数据。XML的标签没有被预定义,你需要自行定义标签。XML被设计为具有自我描述性。是W3C的推荐标准。 二、为什么学习XML? 用来解决程序间数据传输的格式问题 做配置文件 充当小型数据库 三、XML与HTM 为网页添加自己喜欢的字体 知了ing 字体 秒表 css @font-face { font-family: miaobiao;//定义字体名字 font-style: normal; font-weight: 400; src: url('font/DS-DIGI-e.eot');//字体文件 } 使用: <label style="font-size:18px;font-famil redis范围查询应用-查找IP所在城市 矮蛋蛋 redis 原文地址: http://www.tuicool.com/articles/BrURbqV 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210.21.224.34转为3524648994 2. select city from ip_ 输入两个整数, 计算百分比 alleni123 java public static String getPercent(int x, int total){ double result=(x*1.0)/(total*1.0); System.out.println(result); DecimalFormat df1=new DecimalFormat("0.0000%"); 百合——————>怎么学习计算机语言 百合不是茶 java 移动开发 对于一个从没有接触过计算机语言的人来说,一上来就学面向对象,就算是心里上面接受的了,灵魂我觉得也应该是跟不上的,学不好是很正常的现象,计算机语言老师讲的再多,你在课堂上面跟着老师听的再多,我觉得你应该还是学不会的,最主要的原因是你根本没有想过该怎么来学习计算机编程语言,记得大一的时候金山网络公司在湖大招聘我们学校一个才来大学几天的被金山网络录取,一个刚到大学的就能够去和 linux下tomcat开机自启动 bijian1013 tomcat 方法一: 修改Tomcat/bin/startup.sh 为: export JAVA_HOME=/home/java1.6.0_27 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export PATH=$JAVA_HOME/bin:$PATH export CATALINA_H spring aop实例 bijian1013 javaspringAOP 1.AdviceMethods.java package com.bijian.study.spring.aop.schema; public class AdviceMethods { public void preGreeting() { System.out.println("--how are you!--"); } } 2.beans.x [Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization bit1129 serialization enableComplexMapKeySerialization配置项的含义 Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址。 GsonBuilder用于 【Spark九十一】Spark Streaming整合Kafka一些值得关注的问题 bit1129 Stream 包括Spark Streaming在内的实时计算数据可靠性指的是三种级别: 1. At most once,数据最多只能接受一次,有可能接收不到 2. At least once, 数据至少接受一次,有可能重复接收 3. Exactly once 数据保证被处理并且只被处理一次, 具体的多读几遍http://spark.apache.org/docs/lates shell脚本批量检测端口是否被占用脚本 ronin47 #!/bin/bash cat ports |while read line do#nc -z -w 10 $line nc -z -w 2 $line 58422>/dev/null2>&1if[ $?-eq 0]then echo $line:ok else echo $line:fail fi done 这里的ports 既可以是文件 java-2.设计包含min函数的栈 bylijinnan java 具体思路参见:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/ import java.util.ArrayList; import java.util.List; public class MinStack { //maybe we can use origin array rathe Netty源码学习-ChannelHandler bylijinnan javanetty 一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享” 例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是 因为每一次调用decode方法时,可能数据未接收完全(incomplete), 它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的 p java生成随机数 cngolon java 方法一: /** * 生成随机数 * @author [email protected] * @return */ public synchronized static String getChargeSequenceNum(String pre){ StringBuffer sequenceNum = new StringBuffer(); Date dateTime = new D POI读写海量数据 ctrain 海量数据 import java.io.FileOutputStream; import java.io.OutputStream; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming mysql 日期格式化date_format详细使用 daizj mysqldate_format日期格式转换日期格式化 日期转换函数的详细使用说明 DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. The&n 一个程序员分享8年的开发经验 dcj3sjt126com 程序员 在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这里在下想凭借自己的亲身经历,与大家一起探讨一下。 明确入行的目的 很多人干IT这一行都冲着“收入高”这一点的,因为只要学会一点HTML, DIV+CSS,要做一个页面开发人员并不是一件难事,而且做一个页面开发人员更容 android欢迎界面淡入淡出效果 dcj3sjt126com android 很多Android应用一开始都会有一个欢迎界面,淡入淡出效果也是用得非常多的,下面来实现一下。 主要代码如下: package com.myaibang.activity; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.CountDown linux 复习笔记之常见压缩命令 eksliang tar解压linux系统常见压缩命令linux压缩命令tar压缩 转载请出自出处:http://eksliang.iteye.com/blog/2109693 linux中常见压缩文件的拓展名 *.gz gzip程序压缩的文件 *.bz2 bzip程序压缩的文件 *.tar tar程序打包的数据,没有经过压缩 *.tar.gz tar程序打包后,并经过gzip程序压缩 *.tar.bz2 tar程序打包后,并经过bzip程序压缩 *.zi Android 应用程序发送shell命令 gqdy365 android 项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!! 发就发吧! 一、关于shell指令: 我们知道,shell指令是Linux里面带的 java 无损读取文本文件 hw1287789687 读取文件无损读取读取文本文件charset java 如何无损读取文本文件呢? 以下是有损的 @Deprecated public static String getFullContent(File file, String charset) { BufferedReader reader = null; if (!file.exists()) { System.out.println("getFull Firebase 相关文章索引 justjavac firebase Awesome Firebase 最近谷歌收购Firebase的新闻又将Firebase拉入了人们的视野,于是我做了这个 github 项目。 Firebase 是一个数据同步的云服务,不同于 Dropbox 的「文件」,Firebase 同步的是「数据」,服务对象是网站开发者,帮助他们开发具有「实时」(Real-Time)特性的应用。 开发者只需引用一个 API 库文件就可以使用标准 RE C++学习重点 lx.asymmetric C++笔记 1.c++面向对象的三个特性:封装性,继承性以及多态性。 2.标识符的命名规则:由字母和下划线开头,同时由字母、数字或下划线组成;不能与系统关键字重名。 3.c++语言常量包括整型常量、浮点型常量、布尔常量、字符型常量和字符串性常量。 4.运算符按其功能开以分为六类:算术运算符、位运算符、关系运算符、逻辑运算符、赋值运算符和条件运算符。 &n java bean和xml相互转换 q821424508 javabeanxmlxml和bean转换java bean和xml转换 这几天在做微信公众号 做的过程中想找个java bean转xml的工具,找了几个用着不知道是配置不好还是怎么回事,都会有一些问题, 然后脑子一热谢了一个javabean和xml的转换的工具里,自己用着还行,虽然有一些约束吧 , 还是贴出来记录一下 顺便你提一下下,这个转换工具支持属性为集合、数组和非基本属性的对象。 packag C 语言初级 位运算 1140566087 位运算c 第十章 位运算 1、位运算对象只能是整形或字符型数据,在VC6.0中int型数据占4个字节 2、位运算符: 运算符 作用 ~ 按位求反 << 左移 >> 右移 & 按位与 ^ 按位异或 | 按位或 他们的优先级从高到低; 3、位运算符的运算功能: a、按位取反: ~01001101 = 101 14点睛Spring4.1-脚本编程 wiselyman spring4 14.1 Scripting脚本编程 脚本语言和java这类静态的语言的主要区别是:脚本语言无需编译,源码直接可运行; 如果我们经常需要修改的某些代码,每一次我们至少要进行编译,打包,重新部署的操作,步骤相当麻烦; 如果我们的应用不允许重启,这在现实的情况中也是很常见的; 在spring中使用脚本编程给上述的应用场景提供了解决方案,即动态加载bean; spring支持脚本 按字母分类: ABCDEFGHIJKLMNOPQRSTUVWXYZ其他
方式显示 def as_table(self): "Returns this form rendered as HTML
s." 所以,基本表单的功能看BaseForm已经足够了。
2、从模型创建表单
django对于MVC中的C与M间的映射是非常体贴的,集中体现中Model模型中(比如模型的权限与用户认证)。那么,一个模型代表着RDS中的一张表,模型的实例代表着关系数据库中的一行,而form如何与一行相对应呢?
定义一个模型引申出的表单非常简单,例如:
class ProjectForm(ModelForm): class Meta: model = Project fields = ['approvals','manager','name','fund_rource','content','range',]
class ModelForm(six.with_metaclass(ModelFormMetaclass, BaseModelForm)): pass
class BaseModelForm(BaseForm): def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None): opts = self._meta #相比较BaseForm,多了instance参数,它等价于Model模型的一个实例 if instance is None: #不传instance参数,则会新构造model对象 self.instance = opts.model() object_data = {} else: self.instance = instance object_data = model_to_dict(instance, opts.fields, opts.exclude) #此时传递了initial也一样可以生效,同时还会设置到Model中 if initial is not None: object_data.update(initial) def save(self, commit=True): #默认commit是True,此时就会保存Model实例到数据库 if commit: self.instance.save() #同时保存many-to-many字段对应的关系表 self._save_m2m() else: #注意,本篇文章主要用到commit=False这个参数,它会返回Model实例,允许我们在修改instance后,在instance上再调用save方法 self.save_m2m = self._save_m2m return self.instance
所以,对于ModelForm我们可以传入instance参数初始化表单,可以调用save()方法直接将从html里得到的表单数据持久化到数据库中。而我们只需要几十行代码就可以完成这么多工作。
3、通用视图
django.views.generic.ListView和django.views.generic.edit下的CreateView, UpdateView, DeleteView都是通用视图。即,我们又可以通过它们,把很多重复的工作交给django完成,又可以少写很多代码完成同样的功能了。这里仅以CreateView为例说明,因为它相对最复杂,接下来的多ModelForm的提交也是在CreateView上进行的。
通用视图使用时,只需要承继后,再设置model或者form_class即可。比如CreateView就会由django自动的把页面上POST出的form数据解析到model生成的表单(或者form_calss指定的ModelForm类型表单),同时调用表单的save方法将数据添加到模型对应的数据库表中。当然GET请求时会生成空form到页面上。可以看到,除去定义model或者form类外,几行代码就可以搞定这么多事。我们看看CreateView的继承关系:
简单介绍下CreateView通用视图中每个父类的作用。
所以,在用CreateView、一个模型、一个模板实现添加一行记录的功能时是多么简单,因为这些父类会自动生成object,渲染到模板,解析form表单,save到数据库中。所以,从模型创建出的表单ModelForm,配合上通用视图后,威力巨大!!
4、多个ModelForm在一个form里提交
终于可以回到本文的主题了。CreateView默认是处理一个Model模型、一个ModelForm表单的,然而,很多时候为了解耦,会把一张表拆成多张表,通过id关联在一起。在django的模型中就体现为ForeignKey、ManyToManyField或者OneToOneField。而在业务逻辑上,需要体现为一张表单,对应着数据库里的多张表。
例如,我们希望录入合同,其中合同Model中还有地址Model和项目Model,而项目Model中又有地址Model,等等。
当然,我们有很多种实现的方案,但是,前面三部分说了那么多,不是浪费口水的。我们已经有了通用视图+ModelForm这样的利器,难道还需要手动去写Form表单?我们已经习惯了在Model里定义好类型和有点注释作用还能当label的verbose_name,还需要在forms.Form里再来一遍?还需要在视图中写这么通用的逻辑代码吗?当然不用。
inlineformset_factory是一种方案,但它限制太多,而且有些晦涩,我个人感觉是不太好用的。
那么,从第1部分我介绍的Form里的prefix,以及第3部分里类图中的ProcessFormView允许重定义form_valid,以及第2部分中ModelForm的save方法的行为控制,解决方案已经一目了然了。
拿上面提到的例子来说,我们创建合同时,指明了项目,包括项目地址和合同签订地址,这涉及到三张表和四条记录(地址表有两条)。
我们三张表的模型如下:
class PrimeContract(models.Model): address = models.ForeignKey(Address, related_name="prime_contract_address", verbose_name="address") project = models.ForeignKey(Project, related_name="prime_contract", verbose_name="project") class Project(models.Model): address = models.ForeignKey(Address, related_name="project_address", verbose_name="project address") class Address(models.Model): pass
class AddressForm(ModelForm): class Meta: model = Address fields = ... class ProjectForm(ModelForm): class Meta: model = Project fields = ... class PrimeContractForm(ModelForm): class Meta: model = PrimeContract fields = ...
class PrimeContractAdd(CreateView): success_url = ... template_name = ... form_class = PrimeContractForm def get_context_data(self, **kwargs): context = super(PrimeContractAdd, self).get_context_data(**kwargs) #SingleObjectMixin父类只会处理PrimeContractForm表单,另外三条数据库记录对应的表单我们要自己处理了,此时prefix派上用场了,因为Field重名是百分百的事 if self.request.method == 'POST': contractAddressForm = AddressForm(self.request.POST, prefix='contractAddressForm') projectAddressForm = AddressForm(self.request.POST, prefix='projectAddressForm') projectForm = ProjectForm(self.request.POST, prefix='projectForm') else: contractAddressForm = AddressForm(prefix='contractAddressForm') projectAddressForm = AddressForm(prefix='projectAddressForm') projectForm = ProjectForm(prefix='projectForm') #注意要把自己处理的表单放到context上下文中,供模板文件使用 context['contractAddressForm'] = contractAddressForm context['projectAddressForm'] = projectAddressForm context['projectForm'] = projectForm return context #重写form_valid,父类ProcessFormView会在PrimeContractForm表单is_valid方法返回True时调用该方法 def form_valid(self, form): #首先我们要获取到PrimeContractForm表单对应的模型,此时是不能save的,因为外键project和address对应的数据库记录还没有创建,所以commit传为False contract = form.save(commit=False) #获取上面get_context_data方法中在POST里得到的表单 context = self.get_context_data() #按照四条数据库记录的顺序依次的创建(调用save方法)、主键赋到下一条记录的外键中、下一次记录创建(save) projectAddress = context['projectAddressForm'].save() #从项目表单中获取到模型,先把地址的id赋到外键上再保存 project = context['projectForm'].save(commit=False) project.address = projectAddress project.save() contractAddress = context['contractAddressForm'].save() #将合同模型中的address和project都设置好后再保存 contract.address = contractAddress contract.project = project contract.save() return super(PrimeContractAdd, self).form_valid(form)
#这三个表单我们手动处理过的 {{ contractAddressForm }} {{ projectAddressForm }} {{ projectForm }} #这是FormMixin父类帮我们生成的 {{ form }}
从这篇文章里也可以看得出,django实在是快速开发网站的必备神器!当然,快速不代表不能够支撑大并发的应用,instagram这个很火的服务就是用django写的。由于python和django过于灵活,都将要求django的开发者们唯有更资深才能写出生产环境下的服务。